rno*_*ris 0 c++ macros c-preprocessor
情况就是这样:我有三个文件,Test1.cpp和Test2.cpp.Test1.cpp可以按原样编译到独立的应用程序中.Test1.cpp还包含一些我想在Test2.cpp中重用的函数.我正在使用#ifndef #endif块来有条件地排除Test1.cpp的主要功能,这样当我编译Test2.cpp时,Test2.cpp中的main函数将能够调用Test1.cpp中定义的函数.示例代码:
--------------------------------------------
//File: Test1.h
#include <iostream>
void do_something();
--------------------------------------------
//File: Test1.h
#include "Test1.h"
void do_something();
{
std::cout<<"Done"<<std::endl;
}
#ifndef FN_MAIN
int main()
{
do_something();
return 0;
}
#endif
--------------------------------------
//File: Test2.cpp
#define FN_MAIN
#include "Test1.h"
int main()
{
do_something();
return 0;
}
--------------------------------------
Run Code Online (Sandbox Code Playgroud)
使用Test1.cpp调用g ++工作正常并且行为与预期一致,但是使用Test2.cpp和Test1.cpp调用g ++失败,因为main被多次定义.但是,使用-DFN_MAIN和两个源文件调用g ++可以解决此问题.有没有办法解决这个问题?我认为这个问题来自我对C++预处理器的不完全理解.
注意:我这样做的动机是减少我正在处理的项目代码的大小.实际项目包括独立版本的Test1.cpp和其他几个使用Test1.cpp函数的程序.
预处理器按顺序运行每个源文件.在一个.cpp文件中定义的宏不会影响在另一个.cpp文件中定义的宏.
一个选项是FN_MAIN
在标题中定义:然后当Test1.cpp
包括该标题时,宏仍将被定义.但是,我认为在命令行上定义宏可能更简洁; 这取决于您的具体用例.
另一个选择是将其移动Test1.cpp
main()
到单独的.cpp文件中并使用它构建单独的可执行文件.