【问题标题】:Define a variable in header file works only when extern keyword is not present? [duplicate]仅当不存在 extern 关键字时,在头文件中定义变量才有效? [复制]
【发布时间】:2018-10-20 15:05:49
【问题描述】:

我正在学习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`

这迫使我在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 关键字。

【问题讨论】:

  • 在头文件中使用int number;即可;这是您的目标文件中的所谓“暂定定义”,它将在链接时累积为单个定义。是的,number 被初始化为 0 作为任何全局变量。
  • @Ctx 以某种方式与您的评论相矛盾。

标签: c global-variables extern


【解决方案1】:

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

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

extern int number;

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

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

int number;

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

【讨论】:

  • 嗯,很多工具链,我认为 posix 允许多个定义......
  • 所以这意味着如果我在main中声明int number,那么functions.c中也不需要声明?
  • 对函数也是如此还是仅对变量如此?
  • @MichaelB。是的,如果您在functions.c 中明确定义它,您将在多个定义中遇到同样的问题。是的,功能也是如此。
  • 从未听说过暂定定义?
【解决方案2】:

除了一些程序员老兄的回答之外,我还使用了以下构造:

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

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

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

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

【讨论】:

  • 那么如何在 main 中使用一个在头文件中定义的变量,但在其他 .c 文件中看不到?例如,如果我需要 number 只能在 main.c 中看到
  • 然后在main中定义:static int number;
  • 我已经这样做了,我得到了:error: static declaration of ‘number’ follows non-static declaration
  • 只在 main 中定义它。不再在标题中了。
猜你喜欢
  • 1970-01-01
  • 2012-04-22
  • 2015-11-24
  • 2014-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-10
  • 1970-01-01
相关资源
最近更新 更多