在头文件中定义变量仅在不存在extern关键字时有效吗?

时间:2018-10-20 15:05:49

标签: c global-variables 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;
}

functions.c:

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

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

functions.h:

#ifndef FUNCTIONS
#define FUNCTIONS

int number;
extern void printNumber( void );

#endif // FUNCTIONS

程序在Header文件中的方式没有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;
}

functions.c:

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

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

functions.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关键字。

2 个答案:

答案 0 :(得分:1)

对于第一个版本,在头文件中定义变量number。这意味着每个包含头文件的translation unit都将具有变量的定义。不允许这样做,您只能在所有翻译单元上使用单一定义。

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

extern int number;

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

那您当然需要在某个地方定义它。在一个源文件中,输入以下定义:

int number;

即完全是您在最后一个变体中所做的。

答案 1 :(得分:0)

除了一些程序员大佬的答案外,我还使用以下构造:

// functions.h
#indef EXTERN
# define EXTERN extern
#endif
EXTERN int number;

// functions.c
#include "functions.h"

// main.c
#define EXTERN
#include "functions.h"

主编译时,将为number分配存储空间。在所有其他源文件中,它将被声明为extern