5

我在以下代码中遇到了一些问题,特别是在 header.c 中,我无法访问 header.h 中的 extern int x 变量...为什么?.h 中的外部变量不是全局变量吗?我如何在其他文件上使用它?

===header.h===

#ifndef HDR_H
#define HDR_H

extern int x;
void function();

#endif

===header.c===

#include <stdio.h>
#include "header.h"

void function()
{
    printf("%d", x); //****undefined reference to x, why?****
}

===样本.c===

int main()
{
    int x = 1;
    function();
    printf("\n%d", x);
    return 0;
}
4

5 回答 5

8

宣言

extern int x;

告诉编译器在某些源文件中会有一个名为x. 但是,在main函数中声明一个局部变量x。将该声明移到外部main以使其全局化。

于 2012-08-08T09:09:26.570 回答
3

关键字表示变量存在但extern不创建它。编译器期望另一个模块将有一个具有该名称的全局变量,并且链接器将做正确的事情来将它们连接起来。

你需要这样改变sample.c

/* x is a global exported from sample.c */
int x = 1;

int main()
{
    function();
    printf("\n%d", x);
    return 0;
}
于 2012-08-08T09:08:04.607 回答
1

extern声明一个变量,但没有定义它。它基本上告诉编译器有x其他地方的定义。要修复将以下内容添加到header.c(或其他一些.c文件,但只有一个.c文件):

int x;

注意在main()局部变量中x会隐藏全局变量x

于 2012-08-08T09:06:14.070 回答
1

事实上,extern int x;手段x将在另一个地方/翻译单元中定义。

编译器希望x在全局范围内的某个地方找到 的定义。

于 2012-08-08T09:06:54.473 回答
0

我会像这样重新组织/修改您的代码并摆脱 header.c

===样本.h===

#ifndef SAMPLE_H
#define SAMPLE_H

extern int x;
void function();

#endif

===样本.c===

#include <stdio.h>
#include "sample.h"

int x;

void function()
{
    printf("%d", x);
}

int main()
{
    x = 1;
    function();
    printf("\n%d", x);
    return 0;
}
于 2012-08-08T09:32:37.067 回答