C++ 多定义符号
如果在头文件中声明一个全局变量并将其包含在两个.cpp文件中,则链接器会给出一个错误,说明符号是多重定义的。 我的问题是,为什么只对某些类型的对象(例如int)而不对其他类型的对象(例如enum)发生这种情况 我使用的测试代码如下所示: 测试hC++ 多定义符号,c++,compiler-construction,C++,Compiler Construction,如果在头文件中声明一个全局变量并将其包含在两个.cpp文件中,则链接器会给出一个错误,说明符号是多重定义的。 我的问题是,为什么只对某些类型的对象(例如int)而不对其他类型的对象(例如enum)发生这种情况 我使用的测试代码如下所示: 测试h #ifndef TEST_HEADER #define TEST_HEADER namespace test { int i_Test1 = -1; int i_Test2 = -1; }; #e
#ifndef TEST_HEADER
#define TEST_HEADER
namespace test
{
int i_Test1 = -1;
int i_Test2 = -1;
};
#endif // TEST_HEADER
类别1.h
#ifndef CLASS_1_HEADER
#define CLASS_1_HEADER
class class1
{
public:
void count();
};
#endif //CLASS_1_HEADER
类别1.cpp
#include <iostream>
#include "class1.h"
#include "test.h"
void class1::count()
{
std::cout << test::i_Test1 << std::endl;
}
类别2.cpp
#include "class2.h"
#include <iostream>
#include "test.h"
void class2::count()
{
std::cout << test::i_Test2 << std::endl;
}
使用以下内容构建此代码:
g++ main.cpp class1.cpp class2.cpp -o a
生成以下输出:
ld:fatal:symboltest::i_Test1'是
多重定义:
(文件/var/tmp//ccwWLyrM.o type=OBJT;文件/var/tmp//ccOemftz.o
类型=OBJT);ld:致命:符号
test::i_Test2'是多重定义的:
(文件/var/tmp//ccwWLyrM.o type=OBJT;文件/var/tmp//ccOemftz.o
类型=OBJT);ld:fatal:文件处理
错误。未将输出写入到
collect2:ld返回了1个退出状态
如果我更改test.h文件,如下所示:
test.h(带枚举)
我没有得到“乘法定义”错误,程序给出了所需的输出:
5
6
这是因为枚举不是对象,而是类型。类类型(类、结构、联合)和枚举可以在整个程序中多次定义,只要所有定义都满足某些限制(由所谓的一个定义规则(ODR)汇总)。最重要的两个是
- 所有定义都具有相同的标记序列(文本相同)
- 使用的名称在所有定义中必须具有相同的含义(解析为相同的事物)。(这是定义上下文的要求)
g++ main.cpp class1.cpp class2.cpp -o a
#ifndef TEST_HEADER
#define TEST_HEADER
namespace test
{
enum val
{
i_Test1 = 5,
i_Test2
};
//int i_Test1 = -1;
//int i_Test2 = -1;
};
#endif // TEST_HEADER
5
6