我想测试在头文件中定义一个const并在函数中使用它,然后调用它。但是我得到了错误,我添加了包含警卫但没有帮助。错误是:LNK1169:找到一个或多个已定义的乘法符号。我怎么能以另一种方式做到这一点?在.h中声明const并在.cpp中定义此const然后在所有其他.cpps中包含此.cpp是唯一的解决方案吗?
标题
#ifndef STORY
#define STORY
const int x = 4;
#endif
的.cpp
#include <iostream>
#include "8-04.h"
void func1()
{
int w = x;
std::cout << "func1 " << w << std::endl;
}
的.cpp
#include <iostream>
#include "8-04.h"
void func2()
{
int z = x;
std::cout << "func2 " << z << std::endl;
}
主要
#include <iostream>
#include "8-04.h"
#include "8-04first.cpp"
#include "8-04second.cpp"
using namespace std;
int main()
{
func1();
func2();
}
答案 0 :(得分:4)
问题是每个.cpp都包含.h。这意味着每个.o包含const int x
。当链接器将这些链接在一起时,您将获得多个定义。
解决方案是修改.h
#ifndef STORY
#define STORY
extern const int x; //Do not initialise
#endif
和单个 .cpp:
const int x=4
修改强>
我甚至没有看到#include <file.cpp>
业务。不要那样做。太可怕了。
答案 1 :(得分:0)
这应该是:
header.h:
#ifndef STORY
#define STORY
const int x = 4;
void func1();
void func2();
#endif
fun1.cpp
#include <iostream>
#include "header.h"
void func1()
{
int w = x;
std::cout << "func1 " << w << std::endl;
}
fun2.cpp
#include <iostream>
#include "header.h"
void func2()
{
int z = x;
std::cout << "func2 " << z << std::endl;
}
的main.cpp
#include <iostream>
#include "header.h"
using namespace std;
int main()
{
func1();
func2();
}
您不能包含“.cpp”
答案 2 :(得分:0)
可以这样做:
header.h:
#ifndef STORY
#define STORY
const int x = 4;
void func1();
void func2();
#endif
fun1.cpp
#include <iostream>
#include "header.h"
using namespace std;
void func1()
{
int w = x;
cout << "func1 value of w = " << w << "\n";
}
fun2.cpp
#include <iostream>
#include "header.h"
using namespace std;
void func2()
{
int z = x;
cout << "func2 value of z = " << z << "\n";
}
的main.cpp
#include <iostream>
#include "header.h"
int main()
{
func1();
func2();
}
“。cpp”文件不能包含在主源文件中。