c++ - C++ : Cannot I assign values to a variable in header file?

标签 c++

header.h

int m_linkinfo;
m_linkinfo = 1;

ma​​in.cpp

#include "header.h"

int main()
{
    return 0;
}

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

最佳答案

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

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

如您所见,您可以初始化它:

int m_linkinfo = 1;

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

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

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

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

extern int m_linkinfo;

并在非 header (例如 CPP)文件中定义它们:

int m_linkinfo = 1;

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

关于c++ - C++ : Cannot I assign values to a variable in header file?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16313174/

相关文章:

c++ - 修改 Boost::Graph 中的顶点属性

c++ - 在 C++ 中使用多态性和仿函数实现快速性能

c++ - 在没有 Bazel 的情况下使用 TensorFlow 编译 C++ 代码

c++ - 如何在 ODBC native 客户端中获取 SQL Server 日期时间字段

c++ - 可选参数 const 引用重新分配

c++ - CUDA错误: expected constructor,析构函数,或者 'void'之前的类型转换

c++ - G-WAN cc1plus : error: unrecognized command line option "-std=gnu++0x"

c++ - UDP 套接字错误 10049

c++ - 一个空的类会被优化掉吗

c++ - 用于排序的更快的字符串比较,用于 unique()