我正在用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功能(至少根据这个和这个答案)。
但是,每当我尝试创建这样的函数(或从此处或此处复制代码)时,都会出现以下错误:
错误:未定义类似函数的宏“等于”
这对我来说似乎很奇怪,因为它既不是宏也不是未定义的。搜索错误消息时也找不到解决方案。
这是完整的代码供参考:
#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
是预处理程序指令-预处理程序作为编译步骤的一部分运行,但是它不了解C ++作为一种语言。
您不能将预处理器与C ++功能(例如constexpr
函数)混用和匹配。
如果您希望这样做,则需要实现自己的#define EQUALS
宏,该宏在预处理步骤中完全检查字符串的相等性。我不确定是否可行(值得)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句