【发布时间】:2021-03-23 04:02:20
【问题描述】:
以下代码是有效的 C 吗? (godbolt)
typedef struct none none;
none f(none, none);
需要明确:标识符f 永远不会出现在翻译单元中
再次,函数本身从未定义,即使在另一个
翻译单元。
【问题讨论】:
-
你试过编译吗? (如果编译 - 有效,否则 - 无效)
-
@sergeyrar 我不是在询问特定编译器是否按原样接受代码。有些会,有些不会。我问的是从标准的角度来看它是否有效。注意
language-lawyer标签。 -
出于好奇,哪些编译器接受和不接受它?您确定他们都打算遵守相同的标准吗?还没找到不接受的。
-
@NateEldredge gcc、clang 等接受代码。 cparser(git,不在 Godbolt 上)不接受它。它抱怨作为参数的类型不完整:cparser:“错误:匿名'参数'有不完整的类型”。
-
有趣:在 RHEL 7.4 上运行的 GCC 10,2.0 接受代码,即使带有选项
gcc -pedantic -pedantic-errors -Wall -Werror -Wextra -std=c18 …。如果您尝试在源文件中使用或实现该函数,那么错误是正确的——并且 GCC 会发现它。我认为有争论cparser是正确的并且GCC 有疏忽的余地。我不确定一个符合标准的程序是否能发现问题——如果它不能在符合标准的编译器中编译,它就不是符合标准的代码。
标签: c function language-lawyer declaration incomplete-type