如何解决C中函数的extern链接,不使用“extern”可以吗?
您好,我正在查看 C 中函数和变量的外部链接示例。
这是一个产生随机变量的例子。
- random.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;
}
- 这是 main.c
#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;
}
在这个简短的程序中,我想知道为什么两个函数原型的那些没有“extern”说明符以及为什么这段代码编译没有错误。
因为我知道,当我使用其他源代码中的变量或函数时,我必须使用 extern
说明符,例如 extern int a=10;
。
请告诉我。
谢谢。
解决方法
功能块之外的函数和数据定义都有隐式外部链接。然而,当它归结为声明时,数据对象需要extern
关键字,否则它是一个定义。对于函数来说,原型显然不是定义,因为它没有函数体。
关于:
我必须使用 extern 说明符来完成,例如 extern int a=10;
不完全是,在这种情况下,extern int a=10;
是定义而不是声明,因为您已包含初始化程序。它与 int a=10;
相同,如果在其他地方也定义会导致重复定义错误。
默认情况下,全局范围内的符号是外部可见的。这适用于变量和函数。 extern
关键字仅用于防止一个符号的多个定义。它指出当前声明是在别处定义的。
extern
是 call_count 所必需的,否则它将是一个定义。全局函数的声明不需要,因为没有定义。
注意
extern int a=10;
在 gcc 中生成警告:
warning: ‘a’ initialized and declared ‘extern’
,
默认情况下所有函数都是 extern,因此原型不需要 extern
。但是,如果您愿意,您当然可以使用它。
unsigned random_i(void);
=== extern unsigned random_i(void);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。