函数是否在C语言中有任何存储类?
答案 0 :(得分:3)
答案是否定的。根据{{3}}(C99草案)和http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf(C11草案):
6.2.4对象的存储持续时间
1对象具有存储持续时间,用于确定其生命周期。
函数不是对象,因此它们没有存储空间。
6.2.2标识符的链接
3如果对象或函数的文件范围标识符的声明包含存储类说明符
static
,则标识符具有内部链接。
这表示应用于函数的static
会影响其链接(它没有可以应用的存储空间)。
答案 1 :(得分:3)
C标准没有正式定义存储类的含义。
确实定义了“存储类说明符” - 它是关键字之一typedef
,extern
,static
,_Thread_local
,{{ 1}}和auto
。
可以使用存储类说明符register
或extern
声明函数。
该标准确实提到了在几个地方具有“存储类”的对象,例如
如果数组对象具有寄存器存储类,则行为未定义
但永远不会定义对象的存储类是什么。可以合理地假设这是存在于其中一个声明中的存储类说明符关键字,但是如果同一对象的某些声明具有存储类说明符而其他声明没有,则仍然不清楚会发生什么。它也从未被定义为没有任何带有存储类说明符的声明的对象的存储类。
似乎应该避免完全讨论对象或函数的存储类,而是使用由标准精确定义的存储持续时间和链接的相关概念。 。必要时,使用“存储类说明符X出现在声明中”之类的短语,但不要使用“对象/函数具有存储类X”。