在C 中构建临时`main()`函数

Building a temporary `main()` function in c++

本文关键字:main 函数 构建      更新时间:2023-10-16

我只是在学习C 。我有一个main.cpp单元,其中已经有很多东西,我只想构建一个快速的testMain.cpp单元,可以测试几件事。

基本上,我想欺骗编译器(Xcode)忽略一分钟的实际主函数。我可以

  1. main.cpp内部的main()功能重命名为mmain()暂时。
  2. 暂时删除对main.cpp的引用。
  3. 暂时评论main()中的CC_7方法。

所有这些看起来都很笨拙。必须有一种更简单的方法。我怀疑这是人们做的常见的事情。你怎么做?

另一个解决方案是将代码分为多个文件,在一个文件中具有大部分逻辑,在另一个文件中具有真正的主体,而测试主则是第三个文件,您可以编译和链接第一个和第二和第一个文件和第三个文件,但从来都不是所有三个文件。

您的选项2是最常见的策略,从我的理解中也是最清洁的。

毕竟,您的测试应用程序很可能不会共享相同的命令行接口,这通常是唯一的(完全)位于main函数或文件中的唯一内容。

如果您的main.cpp不仅包含了切入点,您应该立即开始考虑如何将该逻辑分配到您已经拥有的模块中。

使用宏。

选项1:使用宏来包含/排除整个文件:

main.cpp:

#ifdef USE_REAL_MAIN
int main(int argc, char* argv[]) {
    ...
}
#endif

testmain.cpp

#ifdef USE_TEST_MAIN
int main(int argc, char* argv[]) {
    ...
}
#ENDIF

构建文件:

gcc -DUSE_REAL_MAIN
gcc -DUSE_TEST_MAIN

选项2:使用命令行宏来重命名main

main.cpp:

int realMain(int argc, char* argv[]) {
    ...
}

testmain.cpp

int testMain(int argc, char* argv[]) {
    ...
}

构建文件:

gcc -DrealMain=main
gcc -DtestMain=main

注意,这可能是最不吸引人的选择,因为它打破了具有UPPER_CASE名称的宏的约定,这意味着您程序的真实入口点对没有看过构建脚本的人并非很明显。这也意味着该程序根本不会编译(因为没有main功能),没有您的自定义构建脚本。

选项3:使用#ifdef指令的新常见main

main.cpp

#include "realMain.h"
#include "testMain.h"
int main(int argc, char* argv[]) {
#ifdef USE_TEST_MAIN
    return testMain( argc, argv );
#else
    return realMain( argc, argv );
#endif
}

构建文件:

gcc -DUSE_REAL_MAIN
gcc -DUSE_TEST_MAIN

我认为这是我的首选选项,因为它几乎是自我记录的,并且向另一个程序员清楚地表明了如何使其工作而无需自定义构建脚本。