3

头文件.h

int m_linkinfo;
m_linkinfo = 1;

主文件

#include "header.h"

int main()
{
    return 0;
}

失败,有很多错误。但如果我评论了这条线m_linkinfo = 1;,一切都很好。为什么?我不能为头文件中的变量赋值吗?但是如果我把头文件改成只有一行:int m_linkinfo = 1;,程序就编译成功了!为什么?和上面两行代码有区别吗?

4

3 回答 3

9

不,你不能。这是一段代码,因此它需要存在于某种函数中,例如:

int main () {
    m_linkinfo = 1;
    return 0;
}

如您所见,您可以使用以下方法对其进行初始化

int m_linkinfo = 1;

但是,因为这是标准允许的。

请记住,在头文件中定义内容通常是有风险的。通过定义,我的意思是创建事物的语句,而不是那些简单地通知编译器而不是事物存在(声明)的语句。

这是因为在两个不同的翻译单元中包含标题可能会导致同名事物的两个副本,如果您随后尝试将它们链接在一起,您会遇到麻烦。

解决这个问题的最好方法是在头文件中声明一些东西,例如:

extern int m_linkinfo;

并将它们定义在非标题(例如,CPP)文件中:

int m_linkinfo = 1;

这样,每个包含标题的翻译单元都知道,m_linkinfo但只有 CPP 文件会创建它。

于 2013-05-01T05:25:02.287 回答
4

C 不允许函数之外的代码。在您的示例中:

int m_linkinfo;
m_linkinfo = 1;

第二行是非法的,因为它不在函数中。

在函数之外,您只能声明或定义变量和函数(或向预处理器提供指示)。

但是,您可以在定义变量时对其进行初始化,因此您可以这样做:

int m_linkinfo = 1;

这是完全合法的。

于 2013-05-01T05:24:36.707 回答
0

赋值是一个声明。语句只允许在函数中使用。头文件中的行不在函数中。因此它不能工作。

于 2013-05-01T05:24:38.947 回答