Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 已声明但未定义的函数的返回类型和参数中的类型不完整_C_Function_Language Lawyer_Declaration_Incomplete Type - Fatal编程技术网

C 已声明但未定义的函数的返回类型和参数中的类型不完整

C 已声明但未定义的函数的返回类型和参数中的类型不完整,c,function,language-lawyer,declaration,incomplete-type,C,Function,Language Lawyer,Declaration,Incomplete Type,下面的代码对C有效吗?() typedef结构无; 无f(无,无); 需要说明的是:标识符f从未出现在翻译单元中 同样,函数本身从未定义过,甚至在另一个函数中也没有定义过 翻译单位。C17标准明确规定允许参数具有不完整的类型: (6.7.6.3(12))如果函数声明器不是该函数定义的一部分,则参数可能不完整 键入并可以在其声明符说明符序列中使用[*]符号来指定变量 长度数组类型 因此,cparser基于此拒绝代码是错误的 至于返回类型,似乎没有一个明确的语句。表示“函数[…]的返回类型必须是完

下面的代码对C有效吗?()

typedef结构无;
无f(无,无);
需要说明的是:标识符
f
从未出现在翻译单元中 同样,函数本身从未定义过,甚至在另一个函数中也没有定义过
翻译单位。

C17标准明确规定允许参数具有不完整的类型:

(6.7.6.3(12))如果函数声明器不是该函数定义的一部分,则参数可能不完整 键入并可以在其声明符说明符序列中使用
[*]
符号来指定变量 长度数组类型

因此,cparser基于此拒绝代码是错误的

至于返回类型,似乎没有一个明确的语句。表示“函数[…]的返回类型必须是完整的非数组对象类型或类型void”,但我在标准中找不到相应的要求。该标准在第6.9.1(3)节“函数定义”下确实指出“函数的返回类型应为
void
或数组类型以外的完整对象类型”,但我认为这只是指定义。同样,6.5.2.2(1)要求被调用的函数必须具有完整的返回类型或
void


所以我的观点是,声明中允许使用不完整的返回类型,只要函数没有定义或调用。但很难确定。

您是否尝试过编译它?(如果编译-有效,否则-无效)@sergeyrar我不是问特定的编译器是否接受原样的代码。有的有,有的没有。我在问,从标准的角度来看,它是否有效。注意
语言律师
标签。出于好奇,哪些编译器接受和不接受它?你确定他们都打算遵守相同的标准吗?我还没有找到任何不接受它的代码。@NateEldredge gcc、clang和其他人接受该代码。cparser(,不在godbolt上)不接受它。它抱怨参数类型不完整:cparser:“error:匿名'parameter'的类型不完整”。有趣的是:运行在RHEL 7.4上的GCC 10,2.0接受代码,即使使用选项
GCC-pedantic-pedantic errors-Wall-Werror-Wextra-std=c18…
。如果您试图在源文件中使用或实现该函数,那么错误是正确的——GCC会发现它。我认为有理由认为,
cparser
是正确的,GCC有疏忽。我不确定一个符合标准的程序是否能发现问题——如果它不能在符合标准的编译器中编译,它就不是符合标准的代码。”[…]6.9.1(3)[…]但我认为这只是指定义。”我也是这样读的,但代码的有效性取决于另一个未知因素:函数声明是否需要最终定义(可能在另一个TU中)?@nebel:我认为不需要。函数
f
是通过外部链接声明的,6.9(5)表示“如果在表达式中使用通过外部链接声明的标识符(而不是作为sizeof或_Alignof运算符的操作数的一部分,其结果是整数常量),在整个程序中的某个地方,标识符应该只有一个外部定义;否则,只能有一个。”这里是“否则”的情况,因此允许零定义。