的 header.h 的
int m_linkinfo;
m_linkinfo = 1;
的的main.cpp 的
#include "header.h"
int main()
{
return 0;
}
失败,有很多错误。但如果我评论了m_linkinfo = 1;
行,那一切都没问题。为什么?我不能为头文件中的变量赋值吗?但是如果我将标题文件更改为只有一行:int m_linkinfo = 1;
,则程序编译成功!为什么?它与上面的两行代码有什么不同吗?
答案 0 :(得分:9)
int main () {
m_linkinfo = 1;
return 0;
}
正如您所见,您可以初始化:
int m_linkinfo = 1;
然而,因为标准允许这样做。
请记住,在头文件中定义事物通常会有风险。通过define,我的意思是创建事物的语句,而不是简单地通知编译器而不是存在的事物(声明)。
这是因为在两个不同的翻译单元中包含标题会导致两个具有相同名称的事物的副本,如果您随后尝试将它们链接在一起,则会遇到麻烦。
解决这个问题的最佳方法是在头文件中声明事物,例如:
extern int m_linkinfo;
并在非标题(例如CPP)文件中定义它们:
int m_linkinfo = 1;
这样,包含标题的每个翻译单元都知道m_linkinfo
,但只有CPP文件会创建它。
答案 1 :(得分:3)
C不允许函数之外的代码。在您的示例中:
int m_linkinfo;
m_linkinfo = 1;
第二行是非法的,因为它不在函数中。
在函数之外,您只能声明或定义变量和函数(或指定预处理器)。
但是,您可以在定义变量时将其初始化,因此您可以执行此操作:
int m_linkinfo = 1;
这是完全合法的。
答案 2 :(得分:0)
作业是一种陈述。声明仅允许在函数中使用。头文件中的行不在函数中。因此它无法工作。