在功能中定义外部变量

时间:2019-12-25 17:44:43

标签: c variables scope linkage

假设以下内容:

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()
{
    //
}

外部必须仅全局定义吗?

1 个答案:

答案 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。它没有定义新对象。