[英]extern linkage of function in C, is it okay to not be with “extern”?
您好,我正在查看 function 和 C 中的变量的外部链接示例。
这是一个产生随机变量的例子。
#define SEED 20
#define MULT 3124
#define INC 2345
#define MOD 5436
unsigned int call_count = 0;
static unsigned seed = SEED;
unsigned random_i(void) {
seed = (MULT * seed + INC) % MOD;
call_count++;
return seed;
}
double random_f(void) {
seed = (MULT * seed + INC) % MOD;
call_count++;
return seed / (double)MOD;
}
#include <stdio.h>
#include <stdlib.h>
#pragma warning (disable:4996)
unsigned random_i(void); // I wonder why this prototype has no "extern" specifier
double random_f(void); // I wonder why this prototype has no "extern" specifier
extern unsigned call_count;
int main(void) {
register int i;
for (i = 0; i < 10; i++)
printf("%d ", random_i());
printf("\n");
for (i = 0; i < 10; i++)
printf("%lf ", random_f());
printf("\nCall count : %d\n", call_count);
return 0;
}
在这个简短的程序中,我想知道为什么两个 function 原型的那些没有“ extern ”说明符以及为什么这段代码编译没有错误。
因为我知道的是,当我使用其他源代码中的变量或函数时,我必须使用extern
说明符,例如extern int a=10;
.
请告诉我。
谢谢。
function 块之外的函数和数据定义都具有隐式外部链接。 但是,当它涉及到声明时,数据 object 需要extern
关键字,否则它是一个定义。 对于函数,原型显然不是定义,因为它没有主体。
关于:
我必须使用 extern 说明符,例如
extern int a=10;
不完全是,在这种情况下extern int a=10;
是定义而不是声明,因为您包含了初始化程序。 同int a=10;
如果也在别处定义,将导致重复定义错误。
默认情况下,全局 scope 处的符号在外部可见。 这适用于变量和函数。 仅需要extern
关键字来防止符号的多个定义。 它指出当前声明在别处定义。
call_count 需要extern
,否则它将是一个定义。 全局函数的声明不需要它,因为没有定义。
注意
extern int a=10;
在 gcc 中生成警告:
warning: ‘a’ initialized and declared ‘extern’
默认情况下,所有函数都是 extern ,因此原型不需要extern
。 但是,如果您愿意,当然可以使用它。
unsigned random_i(void);
=== extern unsigned random_i(void);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.