我正在用 bash 编写一个简单的构建文件,这应该让我可以通过模拟 Python 来轻松切换入口点
if __name__ == '__main__':
main()
我的想法是通过将
-D __MAIN__=\"$MAIN_FILE\"
传递给 clang++ 来包含宏,其中 MAIN_FILE
是您在运行构建脚本时指定的文件。然后,我只需将每个源文件的宏 __MAIN__
与预定义的标准宏 __FILE__
进行比较。像这样的东西:
#if equals(__FILE__, __MAIN__)
int main()
{
/* code */
return 0;
}
#endif
我遇到的问题是使函数
equals
在编译时工作。阅读此内容,似乎应该可以定义一个 constexpr 函数来比较编译时的字符串(至少根据 this 和 this 答案)。
但是,每当我尝试创建这样的函数(或从here或here复制代码)时,我都会收到以下错误:
错误:未定义类似函数的宏“等于”
这对我来说似乎很奇怪,因为它既不是宏也不是未定义的。我在搜索错误信息时也找不到解决方案。
以下是完整代码供参考:
#include <iostream>
constexpr bool equals(const char* a, const char* b)
{
return *a == *b && (*a == '\0' || equals(a + 1, b + 1));
}
#if equals(__FILE__, __MAIN__)
int main()
{
std::cout << "Running " << __MAIN__ << std::endl;
return 0;
}
#endif
编译:
clang++ main.cpp -std=c++14 -D __MAIN__="fullpath/main.cpp"
导致此错误的原因是什么以及如何解决我的问题?
#if
和 #endif
是 preprocessor 指令 - 预处理器作为编译步骤的一部分运行,但它不知道 C++ 作为一种语言。
您不能将预处理器与 C++ 功能(例如
constexpr
函数)混合搭配。
如果您希望它起作用,您需要实现自己的
#define EQUALS
宏,以在预处理步骤中完全检查字符串相等性。我不确定这是否可能(并且值得)。
我想在编译器参数中为 EXP: -D InSingleFileTest 设置一个类似“InSingleFileTest”的标志,而我正在单个文件测试中。并使用类似:
#ifdef InSingleFileTest
int main(...){};
#endif
也许这是 C++ 中进行单个文件测试的标准方法。
你可以这样做:
void func()
{
}
#if __INCLUDE_LEVEL__ == 0
int main()
{
func();
}
#endif
这将起作用,因为仅当不包含该文件时才会定义
main
。
使用 gcc 和 clang 进行测试。