C 什么是';sizeof(功能名称)和#x27;返回?
示例代码:C 什么是';sizeof(功能名称)和#x27;返回?,c,function,sizeof,C,Function,Sizeof,示例代码: int main(void) { printf ("size = %d\n", sizeof(main)); } 返回函数值 sieOS/应用于函数名,例如“代码>主< /代码> < p> ISO-C++禁止应用 sieOS/函数类型的表达式。< /P> ISO/IEC 14882关于C++的说明(第5.3.3节): “大小运算符不得应用于具有函数或不完整类型的表达式,…” 对于标准C(ISO/IEC 9899:1999)第6.5.3.4节,同样适用: “sizeof运算符
int main(void)
{
printf ("size = %d\n", sizeof(main));
}
返回函数值<代码> sieOS/<代码>应用于函数名,例如“代码>主< /代码> < p> ISO-C++禁止应用<代码> sieOS/<代码>函数类型的表达式。< /P>
ISO/IEC 14882关于C++的说明(第5.3.3节):
“大小运算符不得应用于具有函数或不完整类型的表达式,…” 对于标准C(ISO/IEC 9899:1999)第6.5.3.4节,同样适用:“sizeof运算符不得应用于具有函数类型或不完整类型的表达式、此类类型的括号名称或指定位字段成员的表达式。”C标准禁止使用它-当使用
gcc-pedantic
编译时,它对函数类型产生“sizeof”的无效应用警告
但是,gcc
编译它并为sizeof(main)
返回1
,它不是函数指针的大小
它似乎依赖于编译器
操作数可以是一元表达式的标识符,也可以是类型转换表达式(即括在括号中的类型说明符)一元表达式不能表示位域对象、不完整类型或函数指示符
。结果是一个无符号整数常量。标准标题STDDEF.H将此类型定义为size\t
使用编译标志-Wall-pedantic
向sizeof
发出有关错误操作数的警告(请记住sizeof
是编译时间运算符),代码:
另请阅读:
1118-不得将sizeof
运算符应用于具有函数类型或不完整类型的表达式、此类类型的括号名称或指定位字段成员的表达式1127-结果的值由实现定义,其类型(无符号整数类型)为
size\t
,在
(和其他标题)中定义
此外,
size\u t
的正确格式字符串是%zu
,如果它不存在,例如Microsoft的编译器,那么您可以使用%lu
,并根据ISO C11节6.5.3.4运算符的大小和对齐方式,第1小节(约束),将返回值转换为无符号长:
sizeof
运算符不得应用于具有函数类型或不完整类型的表达式、此类类型的括号名称或指定位字段成员的表达式
第6.3.2.1节“左值、数组和函数指示符”中还有第4小节,其中规定:
函数指示符是具有函数类型的表达式。除非它是sizeof
运算符、\u Alignof
运算符(65)或一元&
运算符的操作数,否则它是类型为“函数返回”的函数指示符
类型“”转换为具有指向函数返回的类型“”指针的表达式
键入“”
此处引用的脚注65澄清了这一点:
由于此转换不会发生,因此sizeof
或\u Alignof
运算符的操作数仍然是一个函数指示符,并且违反了6.5.3.4中的约束
根据第4节《合规性》
:
在本国际标准中,“应”应解释为对实施或计划的要求;相反,“不应”应解释为禁止。
因此,严格一致的程序永远不应该采用函数的大小。但是,同样,它可能还应该使用正确形式的main()
:-)
然而,这里有一个漏洞,一个一致性的实现可以提供扩展,“只要它们不严格改变任何应用程序的行为”
一致性计划”(第4节一致性,第6节一致性)
你可以争辩说这是一种行为改变(允许而不是禁止它),但是,由于最初的程序不会严格遵守,小节并没有禁止它。我的猜测是-1是因为TIA(“试试看”)。TIA的问题是它通常不起作用,因为您看到的只是当前编译器和当前选项的实际功能,这可能与编译器应该做的有很大不同。下面的讨论再次证明了这一点。(实际上,您必须在GCC的命令行中添加一个-pedantic
选项来观察“官方”行为。这只是一个编译器)所以这里有一个1的“我”来对付愚蠢的TIAS。它后面的是什么?这个问题被标记为C,所以C++标准没有任何的承载。@ Acth.C++中的很多部分都是从C中采用的。参见YouSin:“<代码> SigeOS/<代码>只对有意义的对象有意义。表示形式为无符号字符[sizeof(type)]
。在C中,函数没有表示形式(没有从函数指针类型到数据指针类型的转换)因此,sizeof
没有任何意义。虽然gcc
可以编译它,但不清楚它是否正在执行从main
到&main
的转换。例如,codepad——它使用GCC4.1.2——对于sizeof(main)
返回1的大小,但是对于sizeof(&main)返回4的大小
@Aeth您完全正确,我在最新和最伟大的GCC 4.5中得到了相同的结果。经过后期编辑。只要符合要求的实现报告了所需的诊断,并且扩展不会改变任何符合要求的程序的行为,就可以提供扩展
sizeof unary-expression
sizeof ( type-name )
$ cat sizeof.c
#include<stdio.h>
int main(){
printf("%zu %p\n", sizeof(main), (void*)main);
return 0;
}
$ gcc -Wall -pedantic sizeof.c -std=c99
sizeof.c: In function ‘main’:
sizeof.c:3:30: warning: invalid application of ‘sizeof’ to a function type
[-pedantic]
sizeof.c:3:38: warning: ISO C forbids conversion of function pointer to
object pointer type [-pedantic]