C main()中声明的函数是具有外部链接还是没有链接?
请参阅以下代码:C main()中声明的函数是具有外部链接还是没有链接?,c,function,external,extern,linkage,C,Function,External,Extern,Linkage,请参阅以下代码: /* first file */ int i; /* definition */ int main () { void f_in_other_place (void); /* declaration */ i = 0 return 0; } /* end of first file */ /* start of second file */ extern int i; /* declaration */ void f_in_other_place (vo
/* first file */
int i; /* definition */
int main () {
void f_in_other_place (void); /* declaration */
i = 0
return 0;
}
/* end of first file */
/* start of second file */
extern int i; /* declaration */
void f_in_other_place (void){ /* definition */
i++;
}
/* end of second file */
我知道外部对象有external
链接,而内部对象有none
链接(暂时忽略extern
)。现在如果我谈论函数f_in_other_place()
,它是在main函数中声明的。那么,它的标识符会被视为内部对象吗?如果是,则它应该具有none
链接,但在程序中可见,此函数引用第二个文件中的定义,该文件显示其标识符的行为类似于具有外部链接的对象。所以我不知道这里的标识符是有外部链接还是无链接
现在转到extern
关键字,我在某处读到函数声明隐式前缀extern
。因此,即使我没有明确提到这个函数标识符的extern
,我函数的标识符在默认情况下是否会成为一个带有external
链接并在main()内起作用的对象?如果我走错了方向,请纠正我。来自:
外部链接。标识符可以从整个程序中的任何其他翻译单元引用所有非静态函数、所有外部变量(除非之前声明为静态)和所有文件范围的非静态变量都具有此链接
[我的重点]
无论在何处声明函数,它始终具有外部链接
我知道外部对象有外部链接和内部链接
对象没有链接
我认为术语“内部对象”是指在块范围中声明的对象
至于这个声明,
int i; /* definition */
那么这就是一个宣言。您可以像这样一个接一个地放置多个这样的声明
int i; /* definition */
int i; /* definition */
int i; /* definition */
编译器在翻译单元末尾生成该变量的所谓暂定定义,并将其初始化为零
对于主要功能声明,则根据C标准(6.2.2标识符链接)
5如果函数的标识符声明没有
存储类说明符,其链接的确定与
已使用存储类说明符extern声明。如果
对象标识符的声明具有文件作用域且没有
存储类说明符,其链接是外部的
及
4表示使用存储类说明符extern声明的标识符
在一个范围内,该标识符的先前声明是
可见,31)如果先前的声明指定了内部或外部
链接,后面声明中标识符的链接是
与先前声明中指定的链接相同如果之前没有
声明是可见的,或者如果先前的声明指定否
链接,则标识符具有外部链接。
所以这个函数声明主要是
void f_in_other_place (void);
相当于
extern void f_in_other_place (void);
由于文件范围中没有以前的函数声明,因此此函数具有外部链接
例如,如果在main之前的文件范围中,会有一个带有关键字static
like的声明
static void f_in_other_place (void);
那么main中声明的函数将具有内部链接。那么所有声明都有隐式extern
前缀是真的吗?您无法强制函数具有none
linkage?@LocalHost no linkage意味着它在声明的范围内是本地的。在其他函数中不能有函数,这就不可能没有链接。一个函数只能有外部或内部链接。明白了。只有一个疑问。该标准规定:对于使用存储类说明符extern声明的标识符,在该标识符的先前声明可见的范围内。在我的程序中,这个范围不是main()
?你说的是文件范围。文件作用域是否与主作用域不同?@LocalHost是在main中声明的函数作用域是main的最外层块作用域,在此作用域中,函数的先前声明不可见。也就是说,main中的函数声明不会在外部作用域中相对于main的作用域重新声明具有相同类型的函数。比如说,如果静态void f_在其他位置(void)
此声明出现在我的main()
声明之前,它对我以后的声明可见吗?然后,它会将链接更改为内部
。我理解得对吗???@LocalHost文件范围中的这个声明在main中是可见的,因为在main中声明函数之前,没有其他声明重新声明这个标识符。因此main中的声明与file作用域中的声明声明声明了同一个函数。Linkage是标识符的属性,而不是函数或对象的属性。正确区分这些概念有助于理解这些概念。