2016-05-31 75 views
0

我想創建一個程序,其行爲有所不同,具體取決於要編譯的兼容附加源代碼文件(其中有些人可能會添加一些不同的功能)。我想到了函數重載,類似於(非編譯)下面的代碼:取決於源代碼文件集的C++程序行爲

file1.cpp:

#include <iostream> 
#include <string.h> 
using namespace std; 

class base { 
    public: 
    void ausgeb() { cout<<"here output base"<<endl; } 
}; 

class derive: public base; 

int main(int argc, char** argv) 
{ 
    derive beisp; 
    beisp.ausgeb(); 
} 

file2.cpp:

#include <iostream> 
    #include <string.h> 
    using namespace std; 
    class base; 
    class derive : public base 
    { 
    public: 
    void ausgeb() { cout<<"here output derive"<<endl; } 
    }; 

現在我想的是:

g++ -o o1 file1.cpp file2.cpp 

and

g++ -o o2 file1.cpp 

應產生具有不同輸出的可執行文件。 可能有滿足這種需求的可能性嗎?

+0

在'file2.cpp'中,可以在文件範圍內有一個對象,其構造函數使用[pimpl](https://en.wikipedia.org/wiki/Opaque_pointer#C)來轉換'derive'的實現。 2B.2B)習語。 –

回答

2

該解決方案是gcc具體,如果你開關編譯器,它很可能將不再工作...

file1.cpp:

#include <iostream> 

void printOut() __attribute__((weak)); 
void printOut() 
{ 
    ::std::cout << "weak" << ::std::endl; 
} 

int main(int, char*[]) 
{ 
    printOut(); 
    return 0; 
} 

file2.cpp:

#include <iostream> 

void printOut() 
{ 
    ::std::cout << "strong" << ::std::endl; 
} 

更高級的(遺漏的printOut實現):

file1.h:

class Base 
{ 
    virtual void printOut(); 
} 

file1.cpp

#include "file1.h" 
Base& getInstance() __attribute__((weak)); 
Base& getInstance() 
{ 
    static Base theInstance; 
    return theInstance; 
} 

int main(int, char*[]) 
{ 
    Base& instance = getInstance(); 
    instance.printOut(); 
} 

file2.cpp:

#include "file1.h" 
class Derived : public Base 
{ 
    virtual void printOut(); 
} 

Base& getInstance() 
{ 
    static Derived theInstance; 
    return theInstance; 
} 

更通用的解決方案,通過定義一個預處理器符號:

file1.h:

class Base 
{ 
    virtual void printOut(); 
} 

file1.cpp

#include "file1.h" 
#ifdef USE_DERIVED 
#include "file2.h" 
#endif 

void Base::printOut() 
{ 
} 

int main(int, char*[]) 
{ 
#ifdef USE_DERIVED 
    Derived instance; 
#else 
    Base instance; 
#endif 
    instance.printOut(); 
} 

file2.h:

#include "file1.h" 
class Derived : public Base 
{ 
    virtual void printOut(); 
} 

file2.cpp:

void Derived::printOut() 
{ 
} 

和編譯在一種情況下

g++ file1.cpp
g++ -DUSE_DERIVED file1.cpp file2.cpp
在的另一個。

相關問題