【问题标题】:C++ multiple definition linking error with const declared in .hC++ 多定义链接错误与 .h 中声明的 const
【发布时间】:2016-09-27 11:57:22
【问题描述】:

我正在使用

中定义的一些常量

常量.h

#ifndef __CONSTANTS_H__
#define __CONSTANTS_H__ 

namespace A{
    namespace B{

    const int FIRST = 1;
    const int SECOND = 2;
    }
}
#endif

我从 2 个不同的 .cpp(A.cpp 和 B.cpp)中包含此文件

gcc 3.2.3 版给了我“多重定义”链接错误

我只通过包含另一个“File.h”来解决问题,其中包含“Constants.h”并声明与“extern”相同的常量

有人可以解释为什么吗?我认为这是 C 中的问题,而不是 C++

【问题讨论】:

  • 添加标题保护或#pragma once
  • @Sugar 我认为这无济于事。
  • 这些常量是什么类型的?如果您在头文件中声明变量,它们将在包含该头文件的每个编译单元中实例化。有很多方法可以解决这个问题,但通常当人们在标头中声明变量(常量或非常量)时,他们会在 .c 文件中定义它们。您的extern 只是向编译器承诺变量是在其他地方定义的,并且链接器会期望在编译对象中的某个地方找到它们。
  • @CoryKramer 你确定吗? const 变量应该具有每个 this 的内部链接
  • @Danh。这是 C++ 而不是 C,C 没有命名空间?具有未声明类型的 C++,称为 FIRST 和 SECOND :)

标签: c++ linker constants


【解决方案1】:

使用 g++ 4.3.4 版:

constants.h:5: error: ISO C++ forbids declaration of `FIRST' with no type

添加类型int后,就可以了。

所以也许你应该使用更新的编译器?用 g++ 代替 gcc?

【讨论】:

  • 文件是A.cpp和B.cpp,用gcc和g++不应该一样吗?
  • 也许不是:stackoverflow.com/questions/172587/…。无论如何:请尝试更新版本!
  • 对不起我用g++,但是机器是旧的RHEL 3,所以我不能改变编译器版本,反正我看到问题可能取决于编译器版本
猜你喜欢
  • 2013-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多