假设以下内容:
test1.h
extern int a;
void init();
test1.c
#include <stdio.h>
#include "test1.h"
int main()
{
init();
printf("%d\n", a);
return 0;
}
test2.c
#include "test1.h"
void init()
{
int a = 1;
}
上面会给我一个linker error
,说a
没有定义,但是在init()
下定义了。
但是,如果我像这样更改test2.c
,它将起作用:
int a = 1;
void init()
{
//
}
外部必须仅全局定义吗?
答案 0 :(得分:0)
内部或外部链接可能只有具有文件作用域的变量。
在第一个示例中
void init()
{
int a = 1;
}
变量a具有块范围,因此没有链接。
在标题中
extern int a
声明了具有外部链接的变量,该变量具有文件范围。但是它没有定义。因此,链接器会发出错误,因为它找不到变量定义。
您可以使用extern说明符声明一个块范围变量。但这不是变量定义。该声明将引用在文件作用域中声明具有链接的变量。
例如考虑下面的演示程序
#include <stdio.h>
int x = 10;
void f( void )
{
extern int x;
printf( "x = %d\n", x );
}
int main(void)
{
f();
x = 20;
f();
return 0;
}
其输出为
x = 10
x = 20
即使用外部链接定义了文件范围变量x
。在函数f
的外部块范围内,变量x
的声明引用文件范围内的变量x
。它没有定义新对象。