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是标识符的属性,而不是函数或对象的属性。正确区分这些概念有助于理解这些概念。