我的SW中存在链接器错误。我正在使用基于h,hpp,cpp文件的以下结构。有些类是模板化的,有些不是,有些是函数模板。 SW包含数百个包含的类......
声明:
test.h
#ifndef TEST_H
#define TEST_H
class Test
{
public:
template <typename T>
void foo1();
void foo2 ();
};
#include "test.hpp"
#endif
定义:
test.hpp
#ifndef TEST_HPP
#define TEST_HPP
template <typename T>
void Test::foo1() {}
inline void Test::foo2() {} //or in cpp file
#endif
CPP文件:
test.cpp
#include "test.h"
void Test::foo2() {} //or in hpp file as inline
我有以下问题。变量vars []在我的h文件中声明
test.h
#ifndef TEST_H
#define TEST_H
char *vars[] = { "first", "second"...};
class Test
{
public: void foo();
};
#include "test.hpp"
#endif
并用作hpp文件中定义为内联的foo()方法内的局部变量。
test.hpp
#ifndef TEST_HPP
#define TEST_HPP
inline void Test::foo() {
char *var = vars[0]; //A Linker Error
}
#endif
但是,会发生以下链接器错误:
Error 745 error LNK2005: "char * * vars" (?vars@@3PAPADA) already defined in main.obj
如何以及在何处声明vars []以避免链接器错误?包括
之后#include "test.hpp"
宣布它已经晚了......
正如我所写,该软件包含很多cpp,并且hpp文件互相包含(所有包含都已经过检查)。发送整个例子是不可能的......
main.obj表示包含主类的文件。
答案 0 :(得分:3)
使用extern链接
在标头中声明vars
extern const char* vars[];
并在一个源文件中定义
const char* vars[] = {"foo", "bar"};
请注意const
,不推荐将字符串文字转换为char*
。您现在拥有它的方式,违反了One definition rule(您在标题所包含的每个翻译单元中重新定义vars
)。
答案 1 :(得分:2)
我认为你只需要在test.hpp
中使用它extern char *vars[];
...这在test.cpp
中char *vars[] = { "first", "second"...};
答案 2 :(得分:0)
我假设您没有声明两个名为Test
的类。如果你是,这将导致你没有问题的结束。你不被允许这样做。
所以我假设class Test
的完整声明如下:
class Test
{
public:
void foo();
template <typename T>
void foo1();
void foo2 ();
};
如果是这种情况,那么你的问题很明显。
您需要更改vars
的定义。您需要在test.h
:
extern char *vars[];
这是test.cpp
:
char *vars[] = { "first", "second"...};
否则编译器会认为您正在尝试在每个文件中声明新版本的vars
。