簡體   English   中英

C ++鏈接器如何選擇要鏈接到可執行文件的類的定義

[英]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.cppbad.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM