以下代码是否为有效的C语言?(godbolt)
清楚地说,标识符
typedef struct none none;
none f(none, none);
清楚地说,标识符
f
在翻译单元中不再出现,并且该函数本身也从未被定义,甚至没有在另一个翻译单元中定义。typedef struct none none;
none f(none, none);
f
在翻译单元中不再出现,并且该函数本身也从未被定义,甚至没有在另一个翻译单元中定义。f
被声明为外部链接,6.9(5)规定:“如果使用具有外部链接的标识符作为表达式中的一部分(除了作为sizeof或_Alignof运算符的操作数之一,其结果是整数常量),则在整个程序中必须恰好有一个外部定义该标识符;否则,不得超过一个。”在这里,我们处于“否则”的情况下,因此允许零个定义。 - Nate Eldredge
language-lawyer
标签。 - nebelgcc -pedantic -pedantic-errors -Wall -Werror -Wextra -std=c18 …
。如果您尝试在源文件中使用或实现该函数,则错误是正确的,而GCC会发现它。我认为有理由认为cparser
是正确的,而GCC则存在疏忽。但是,如果无法在符合规范的编译器中编译,则不符合规范的代码不能解决问题。 - Jonathan Leffler