首页 > 解决方案 > 仅当不存在 extern 关键字时,在头文件中定义变量才有效?

问题描述

我现在正在学习,C我真的不明白头文件是如何工作的,并且确定我有两个问题。

1)我们看一下下面的程序:main.c:

#include <stdio.h>
#include <string.h>
#include "functions.h"


int main( void )
{
    printf( "Num = %d\n", number );
    printNumber();
    return 0;
}

函数.c:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "functions.h"

void printNumber( void )
{
    printf("Number = %d\n", number );
}

函数.h:

#ifndef FUNCTIONS
#define FUNCTIONS

int number;
extern void printNumber( void );

#endif // FUNCTIONS

程序在头文件中的方式没有extern涉及关键字,因此似乎有引用number和程序输出:

Num = 0
Number = 0

第一个问题是,是否已number初始化(如果number仅在头文件中存在数字全局变量或类似变量),这是合法的代码/程序吗?

第二种情况,我们看一下main.c下面的代码:

#include <stdio.h>
#include <string.h>
#include "functions.h"

int main( void )
{
    printf( "Num = %d\n", number );
    printNumber();
    return 0;
}

函数.c:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "functions.h"

void printNumber( void )
{
    printf("Number = %d\n", number );
}

函数.h:

#ifndef FUNCTIONS
#define FUNCTIONS

extern int number;
extern void printNumber( void );

#endif // FUNCTIONS

这里程序将无法编译,因为

`undefined reference to number`

这迫使我number声明main

#include <stdio.h>
#include <string.h>
#include "functions.h"

int number;

int main( void )
{
    printf( "Num = %d\n", number );
    printNumber();
    return 0;
}

哪个是正确的方法,为什么?最后一件事,为什么也不完全适用void printNumber( void )。我看到它在有或没有extern关键字的情况下都有效。

标签: cglobal-variablesextern

解决方案


对于第一个版本,在头文件中定义变量number. 这意味着每个包含头文件的翻译单元都有一个变量定义。这是不允许的,您只能将一个定义分布在所有翻译单元中。

该问题的解决方案是在头文件中声明变量:

extern int number;

使用关键字将其extern标记为声明而不是定义,编译器将知道该变量是在其他地方定义的。

然后你当然需要在某个地方定义它。在一个源文件中放置定义:

int number;

即,正是您在最后一个变体中所做的。


推荐阅读