在C 中构建临时`main()`函数
Building a temporary `main()` function in c++
我只是在学习C 。我有一个main.cpp
单元,其中已经有很多东西,我只想构建一个快速的testMain.cpp
单元,可以测试几件事。
基本上,我想欺骗编译器(Xcode)忽略一分钟的实际主函数。我可以
- 将
main.cpp
内部的main()
功能重命名为mmain()
暂时。 - 暂时删除对
main.cpp
的引用。 - 暂时评论
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
我认为这是我的首选选项,因为它几乎是自我记录的,并且向另一个程序员清楚地表明了如何使其工作而无需自定义构建脚本。
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- "main"函数堆栈中的对象在第一个任务运行时被覆盖 (FreeRTOS)
- 为什么 'main' 函数中的局部 int 变量会自动初始化?
- 为什么在我的 main 函数中声明整数后我的整数数组中会出现错误?
- 尝试更改 main 函数内的全局变量值时出现编译错误 C++.
- 我应该在 main 函数中写什么来测试我的问题?
- 如何在 main 函数中输出两个新字符串C++?
- 有没有办法通过 main 函数访问受保护的矢量大小而无需将其转换为公共?
- 我们可以在main函数中声明嵌套类对象吗
- 为什么Main函数上的Sleep()会停止所有线程
- C++ main 函数中初始化静态变量
- 为什么VC++/MFC没有main函数?
- 如何在 main 函数的一个对象中初始化两个类的值?C++
- 在 C++ 中解析 main 函数的大量输入的正确方法是什么
- 如何编写一个 void 函数,该函数将在数组中搜索值,并通过引用将该值的位置传递回 main 函数
- 如何将矩阵参数发送到从C 中的MAIN函数
- 如何从子例程函数获取到 main 函数的返回值
- 为什么我不能在 main 函数中更改类的公共变量
- C++编译错误:多个定义"main",但项目中只有一个 main 函数
- 如何使用 x86 程序集在 c 中访问 main 函数中的变量