C++程序行为取决于源代码文件集

C++ program behaviour depending on source code file set

本文关键字:源代码 文件 取决于 程序 C++      更新时间:2023-10-16

我想创建一个程序,该程序的行为会有所不同,具体取决于要编译的临时附加源代码文件(有些人可能会添加一些不同的功能)。我想到了函数重载,类似于(不可编译的)以下代码:

文件1.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();
 }

文件2.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

g++ -o o2 file1.cpp

应生成具有不同输出的可执行文件。是否有可能满足这一需要?

这个解决方案是 gcc 特定的,如果你切换编译器,它很可能不再工作了......

文件1.cpp:

#include <iostream>
void printOut() __attribute__((weak));
void printOut()
{
    ::std::cout << "weak" << ::std::endl;
}
int main(int, char*[])
{
    printOut();
    return 0;
}

文件2.cpp:

#include <iostream>
void printOut()
{
    ::std::cout << "strong" << ::std::endl;
}

更高级(省略打印输出实现):

文件1.h:

class Base
{
    virtual void printOut();
}

文件1.cpp

#include "file1.h"
Base& getInstance() __attribute__((weak));
Base& getInstance()
{
    static Base theInstance;
    return theInstance;
}
int main(int, char*[])
{
    Base& instance = getInstance();
    instance.printOut();
}

文件2.cpp:

#include "file1.h"
class Derived : public Base
{
    virtual void printOut();
}
Base& getInstance()
{
    static Derived theInstance;
    return theInstance;
}

更通用的解决方案,通过定义预处理器符号:

文件1.h:

class Base
{
    virtual void printOut();
}

文件1.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();
}

文件2.h:

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

文件2.cpp:

void Derived::printOut()
{
}

并在一种情况下使用 g++

file1
.cpp 编译,在另一种情况下使用
g++ -DUSE_DERIVED file1.cpp file2.cpp
进行编译。