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

标签 c global-variables extern

<分区>

我现在正在学习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;
}

函数.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 global 变量或类似的,如果 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`

这迫使我在 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;

即正是您在上一个变体中所做的。

关于c - 仅当不存在 extern 关键字时,在头文件中定义变量才有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52907026/

相关文章:

安卓NDK : Infinite Loop Not Being Called Infinitely

java - android中是否有用于ms office word(.doc/.docx)到(image/html/xml/pdf)转换的Api

c++ - 函数模板显式实例化 extern

c - 为什么在 C 的 header 中使用 extern 关键字?

c - 递增 float 的有效位数

c++ - 查找全局变量而不是在 C++ 函数中构造它们

声明全局变量的 Javascript 情况?

java - 类的不同方法更改成员数据与全局变量有何不同

c++ - 在没有定义的情况下按值传递空变量是否安全?

c - 将 exec 输出重定向到缓冲区或文件