我正在用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在编译时工作。对此进行阅读,似乎应该可以定义一个用于比较编译时字符串(至少根据this和this的答案)的constexpr函数。
但是,每当我尝试创建这样一个函数(或从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"是什么导致了这个错误,我如何解决我的问题?
发布于 2018-04-29 12:43:38
#if和#endif是预处理器指令--预处理器作为编译步骤的一部分运行,但它并不知道C++是一种语言。
不能将预处理器与C++功能(如constexpr函数)混合和匹配。
如果希望这样做,则需要实现自己的#define EQUALS宏,该宏在预处理步骤中完全检查字符串相等。我不确定这是否可能(也不值得)。
https://stackoverflow.com/questions/50086636
复制相似问题