示例代码:
main ()
{
printf ("size = %d\n", sizeof (main));
}
Run Code Online (Sandbox Code Playgroud)
qrd*_*rdl 14
C标准禁止它 - 在编译时gcc -pedantic,它会产生invalid application of ‘sizeof’ to a function type警告.
然而gcc编译它,并返回1了sizeof(main),这是不是一个尺寸的函数指针.
它似乎与编译器有关.
sizeof运算符
Run Code Online (Sandbox Code Playgroud)sizeof unary-expression sizeof ( type-name )操作数可以是一元表达式的标识符,也可以是类型转换表达式(即括在括号中的类型说明符).一元表达式不能表示位字段对象,不完整类型或a
function designator.结果是无符号整数常数.标准头文件STDDEF.H将此类型定义为size_t.
使用编译标志-Wall -pedantic向不正确的操作数发出警告sizeof(记住sizeof是编译时操作符),代码:
$ cat sizeof.c
#include<stdio.h>
int main(){
printf("%zu %p\n", sizeof(main), (void*)main);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
GCC版本4.6.3(Ubuntu/Linaro 4.6.3-1ubuntu5)的编译消息:
$ 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]
Run Code Online (Sandbox Code Playgroud)
阅读:
6.5.3.4 sizeof运算符
1118 -
sizeof运算符不应该应用于具有函数类型或不完整类型的表达式,这种类型的带括号的名称,或者应用于指定位字段成员的表达式
1127 - 结果的值是实现 -已定义,其类型(无符号整数类型)size_t在<stddef.h>(和其他标题)中定义
此外,正确的格式字符串size_t是%zu,如果它不存在,例如微软的编译器,那么你可以使用%lu和转换返回值unsigned long.
ISO C++禁止应用于sizeof函数类型的表达式.
关于C++的ISO/IEC 14882说(第5.3.3节):
"大小运算符不应用于具有函数或不完整类型的表达式,......"
标准C(ISO/IEC 9899:1999)第6.5.3.4节同样适用:
" sizeof运算符不应该应用于具有函数类型或不完整类型的表达式,这种类型的带括号的名称,或者应用于指定位字段成员的表达式."