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

Define a variable in header file works only when extern keyword is not present?

我正在学习C,我真的不明白header如何 文件有效,并确保我有两个问题。

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

程序在头文件中的方式没有extern关键字 涉及到所以似乎提到了 number 和程序 输出:

Num = 0
Number = 0

第一个问题是,number 是否被初始化(数字是全局的 变量或类似的(如果 number 仅存在于头文件中) 这是合法的 code/program?

第二种情况,我们看下面的代码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`

这迫使我在 main 中声明 number:

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

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

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

extern int number;

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

那么你当然需要在某处定义它。在一个源文件中放置定义:

int number;

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

除了一些程序员哥们的回答外,我还使用了以下结构:

// 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.