编译和链接过程如何工作?
(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)
我想了解外部联系和内部联系及其区别.
我也想知道的意思
const默认情况下,变量内部链接,除非另有声明extern.
未命名的命名空间如何优于static关键字?
C++中的一个定义规则究竟是什么意思?我能找到的唯一值得信赖的事件是在C++编程语言中,第3版.编辑,第9.2.3节.除了那个规则之外,该规则是否有官方定义?
可能重复:
对静态成员有未定义的引用是什么意思?
如果我在类声明之外实现函数,我不知道为什么我得到错误"未定义引用`TT :: i'"?这是代码..
class TT{
private:
static int i;
public:
void t();
};
void TT::t(){
i=0;
}
Run Code Online (Sandbox Code Playgroud) 我在 C++ 类中有一个静态 stl 映射,并且有另一个静态成员函数来返回指向映射中对象的常量指针。该映射对于该类中的所有对象都是通用的。
唯一的问题是,我需要搜索这个映射并从另一个类(位于不同的 .cpp/.h 文件中)设置它,当我尝试在 vs2010 中编译它们时,我得到了未解析的外部符号。这些方法在 Timestream 类中定义为
static void setRoomList(std::map<std::string, RoomDescription> rl);
static RoomDescription * getRoom(std::string ref);
Run Code Online (Sandbox Code Playgroud)
这两个函数都是公共的,因此不应该存在访问问题。这些函数在 Timestream.cpp 文件中正常定义,即
RoomDescription * Timestream::getRoom(std::string ref)
{
std::map<std::string, RoomDescription>::iterator cIter= roomList.find(ref);
if(cIter!=roomList.end())
return &(cIter->second);
return NULL;
}
Run Code Online (Sandbox Code Playgroud)
我想这样称呼它
RoomDescription *r =Timestream::getRoom("Bathroom")
Run Code Online (Sandbox Code Playgroud)
来自其他班级。网络上的其他帖子似乎谈论使用 extern,但我对此不确定。我不明白为什么这与从不同类调用任何其他成员函数有什么不同?
谢谢,詹姆斯
编辑:是的,我已经声明了
std::map<std::string, RoomDescription> roomList;
Run Code Online (Sandbox Code Playgroud)
位于 Timestream.cpp 文件的顶部。在标头中它被定义为
static std::map<std::string, RoomDescription> roomList;
Run Code Online (Sandbox Code Playgroud)
我已将 RoomDescription 的标头包含在我尝试从中调用这些方法的类的标头中。
我得到的错误是这样的
Import.obj :错误 LNK2019:无法解析的外部符号“public: static void __cdecl Timestream::setRoomList(class std::map,class std::allocator >,class RoomDescription,struct std::less,class std::allocator >> ,class std::allocator,class std::allocator > …
我有这个代码:( BITMAPS是一个免费的名字)
class BITMAPS{
public:
static ALLEGRO_BITMAP *cursor;
static void load_bitmaps();
static void unload_bitmaps();
};
Run Code Online (Sandbox Code Playgroud)
我试图像这样使用它:( 有错误的行)
line 9: BITMAPS.load_bitmaps();
line 23: BITMAPS.unload_bitmaps();
line 36: BITMAPS.cursor;
Run Code Online (Sandbox Code Playgroud)
但我得到这样的错误 :( 错误)
line 9 and 23: syntax error : missing ';' before '.'
line 36: token '.' is illegal after UDT 'BITMAPS'
line 36: 'BITMAPS' : illegal use of this type as an expression
line 36: left of '.cursor' must have class/struct/union
Run Code Online (Sandbox Code Playgroud)
问题是什么?
编辑:
我改变了.到::现在我得到了这个: …
有许多类似的问题,实际上我从其他几个帖子中编写了以下代码.不幸的是,我仍然有一个错误,我似乎无法破解 - 虽然我做了很多15年前的c ++开发.
我想使用地图制作一个简单的静态查找表.
这是到目前为止的代码(代码css似乎不能很好地呈现它):
enum RegionCodeEnum
{
One,
Two,
Three
};
enum DeviceCodeEnum
{
AAA,
BBB,
CCC
};
class LookupTable
{
friend class constructor;
struct constructor
{
constructor()
{
table[One] = AAA;
table[Two] = AAA;
table[Three] = CCC;
}
};
static constructor cons;
public:
LookupTable(void);
static DeviceCodeEnum GetDeviceFromRegion(RegionCodeEnum RegionCode);
private:
static map<RegionCodeEnum, DeviceCodeEnum> table;
};
LookupTable::constructor LookupTable::cons;
LookupTable::LookupTable(void)
{
}
DeviceCodeEnum LookupTable::GetDeviceFromRegion(RegionCodeEnum RegionCode)
{
return table[RegionCode];
}
Run Code Online (Sandbox Code Playgroud)
从其他地方代码我有这个代码:
DeviceCodeEnum code= LookupTable::GetDeviceFromRegion(One);
Run Code Online (Sandbox Code Playgroud)
我得到的编译错误是:
error LNK2001: unresolved external symbol "private: …Run Code Online (Sandbox Code Playgroud) 在链接此代码时:
#include <map>
using std::map;
#include <string>
using std::string;
class C {
public:
static void dump() {
for (const auto& e : data) {
string(e.first);
}
}
private:
static map<string,map<string,string>> data;
};
int main() {
C::dump();
}
Run Code Online (Sandbox Code Playgroud)
...我收到此错误:
/tmp/cc4W2iNa.o: In function `C::dump()':
test.cpp:(.text._ZN1C4dumpEv[_ZN1C4dumpEv]+0x9): undefined reference to `C::data'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
......来自g ++(GCC)4.9.1.我做错了吗?
c++ ×10
c++-faq ×3
static ×3
definition ×2
linker ×2
c ×1
c++11 ×1
class ×1
declaration ×1
gcc ×1
map ×1
namespaces ×1
oop ×1
syntax-error ×1
terminology ×1