我认为我遇到了一个简单的问题。但是,就我不熟悉C ++编程而言,我无法解决它。我创建了一个新的C ++项目,使代码尽可能简短(因为原始代码要长得多),同时保持我的问题。我在Stackoverflow和谷歌上搜索了大约50个相关问题,但到目前为止还没有任何帮助我解决它。将所有内容放在一个cc和一个h文件中可以正常工作,但这不是我喜欢做的事情。在此先感谢您的帮助。
我使用的是Ubuntu 14.04 / Code :: Blocks 13.12 / gcc和g ++ 4.8.2
问题是我想访问在不同文件中定义的类中的函数,并且在编译工作时(由于file1.h中的extern)链接失败。如果我只是把"简单的S1;"而不是" extern Simple S1;"在file1.h并从file1.cc中删除它我得到一个多重声明错误,这是预期的。显然" extern"诀窍不适用于类,而它适用于变量。
file1.h:
#ifndef FILE1_H
#define FILE1_H
class Simple
{
private:
unsigned int length = 10;
public:
void SetLength(unsigned int l) {length = l;}
unsigned int GetLength() {return length;}
};
extern Simple S1;
#endif
file1.cc:
#include <iostream>
#include "file1.h"
#include "file2.h"
int main()
{
Simple S1;
unsigned int l = GetL();
std::cout << "length=" << l << "\n";
l = 20;
l = GetL();
std::cout << "length=" << l << "\n";
return 0;
}
file2.h:
#ifndef FILE2_H
#define FILE2_H
unsigned int GetL();
#endif
file2.cc:
#include "file1.h"
#include "file2.h"
unsigned int GetL()
{
return S1.GetLength();
}
构建命令和错误:
g++ -std=c++11 -Wall -fexceptions -g -c file1.cc -o obj/Debug/file1.o
g++ -std=c++11 -Wall -fexceptions -g -c file2.cc -o obj/Debug/file2.o
g++ -o bin/Debug/Test obj/Debug/file1.o obj/Debug/file2.o
obj/Debug/file2.o: In function `GetL()':
file2.cc:6: undefined reference to `S1'
collect2: error: ld returned 1 exit status
答案 0 :(得分:0)
如果S1是全局的,则必须在全局范围内定义,而不是在main()内定义,这将创建该函数的本地新实例。
将Simple S1;
放在函数中的main()之前。
#include <iostream>
#include "file1.h"
#include "file2.h"
Simple S1;
int main()
{
unsigned int l = GetL();
std::cout << "length=" << l << "\n";
l = 20;
l = GetL();
std::cout << "length=" << l << "\n";
return 0;
}
答案 1 :(得分:0)
extern Simple S1;
此声明承诺在代码中的其他位置存在类型为S1
的全局对象Simple
。但你永远不会定义这样的对象。您最接近的是S1
内的局部变量main()
,但当然,这是完全不同的事情。
所以,只需将S1
的定义移到main()
之外:
Simple S1;
int main()
{
unsigned int l = GetL();
std::cout << "length=" << l << "\n";
l = 20;
l = GetL();
std::cout << "length=" << l << "\n";
return 0;
}