C++程序行为取决于源代码文件集
C++ program behaviour depending on source code file set
我想创建一个程序,该程序的行为会有所不同,具体取决于要编译的临时附加源代码文件(有些人可能会添加一些不同的功能)。我想到了函数重载,类似于(不可编译的)以下代码:
文件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进行编译。
相关文章:
- 如何在源代码中包含外部库的头文件?
- 为什么将函数体放置在单独的源代码文件而不是标题中的C/C 中
- C++程序行为取决于源代码文件集
- 尽管进行了设置,Visual Studio仍无法打开源代码文件
- 无法打开源代码文件 "afxwin.h" / "afxext.h" / "afxdisp.h" / "afxdtctl.h" / "afxcmn.h" /afxdisp.h 等
- Qt自动生成的表单提供了错误的源代码文件路径
- 带有多个MySQL源代码文件的GDB
- 可视化 如何在项目中使用多个C++源代码文件
- 如何标记c++源代码文件(转换为标记序列)
- 如何在Visual Studio中的项目之间共享C++源代码文件
- 如何?:将cv::Mat定义为类成员,然后在源代码文件中对其进行修改
- 使用大型源代码文件的IDE建议
- Intellisense不能开放源代码文件"*.h"
- Visual Studio 2010 - 无法打开源代码文件 <QtGui/QApplication>
- 为什么致命错误C1083:不能打开源代码文件(vc++)
- 智能感知:无法在C++中打开"curl.h"的源代码文件
- 用于比较给定两个源代码文件的同一c++函数的两个版本的工具
- 如何在Makefile中根据多个源文件各自的头依赖关系构建多个源代码文件
- 我怎么能把这个qt程序到一个源代码文件
- Visual Studio 2012始终编译所有源代码文件