[英]How does the c++ linker choose which definition of a class to link into an executable
我在頭文件foo.h
中有一個類foo
,它根據是否定義了宏而以不同的方式打印。
foo.h中
#pragma once
#include <iostream>
class foo
{
public:
void print()
{
#ifdef GOOD
std::cout << "good\n";
#else
std::cout << "bad\n";
#endif
}
};
然后,我有兩個cpp文件, good.cpp
和bad.cpp
包括foo.h
-一個定義宏,且沒有其他。
good.cpp
#define GOOD
#include "foo.h"
void good()
{
foo f;
f.print();
}
bad.cpp
#include "foo.h"
void bad()
{
foo f;
f.print();
}
最后,在我的主程序中,我有這個
main.cpp中
extern void good();
extern void bad();
int main(int argc, char* argv[])
{
good();
bad();
}
使用VC ++ 2013,將輸出以下輸出
bad
bad
鏈接器為什么選擇foo
的“錯誤”版本? 有沒有辦法強制鏈接器選擇特定版本的foo
?
如果在多個翻譯單元中定義了具有外部鏈接的類,則所有定義必須相同。 通過在具有不同GOOD
值的不同轉換單元中兩次包含foo.h
,您已經生成了foo
類的兩個不同定義。 這是不正確的形式,不需要診斷,任何事情都可能發生。
您詢問的有關選擇“哪個”類定義的問題是沒有意義的,因為在翻譯產生的目標文件中不存在“類”的類。 而是,在假定類確實在每個翻譯單元中都具有該定義的前提下,編譯包含類定義的每個翻譯單元。 當翻譯單元鏈接在一起時,如果此假設不正確,則可能會發生不好的情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.