sizeof(函数名)返回什么?

Poi*_*ter 25 c

示例代码:

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编译它,并返回1sizeof(main),这是不是一个尺寸的函数指针.

它似乎与编译器有关.

  • 虽然`gcc`可以编译它,但是不清楚它是在执行从`main`到`&main`的转换.例如,使用gcc 4.1.2的键盘 - 对于`sizeof(main)`返回大小1,对于`sizeof(&main)`返回大小4. (2认同)

Gri*_*han 6

sizeof运算符

 sizeof unary-expression
 sizeof ( type-name )
Run Code Online (Sandbox Code Playgroud)

操作数可以是一元表达式的标识符,也可以是类型转换表达式(即括在括号中的类型说明符).一元表达式不能表示位字段对象,不完整类型或afunction 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.


zol*_*i2k 5

ISO C++禁止应用于sizeof函数类型的表达式.

关于C++的ISO/IEC 14882说(第5.3.3节):

"大小运算符不应用于具有函数或不完整类型的表达式,......"

标准C(ISO/IEC 9899:1999)第6.5.3.4节同样适用:

" sizeof运算符不应该应用于具有函数类型或不完整类型的表达式,这种类型的带括号的名称,或者应用于指定位字段成员的表达式."

  • 这个问题被标记为C,因此C++标准没有任何影响. (6认同)