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]