在 C++ 中模拟 if __name__ == __main__ 导致错误 "function-like macro is not defined"
Emulating if __name__ == __main__ in c++ causes error "function-like macro is not defined"
我正在用 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 and this 答案)。
但是,每当我尝试创建这样的函数(或从 here or here 复制代码)时,我都会收到以下错误:
error: function-like macro 'equals' is not defined
这对我来说似乎很奇怪,因为它既不是宏也不是未定义的。我在搜索错误信息时也找不到解决方案。
完整代码供参考:
#include <iostream>
constexpr bool equals(const char* a, const char* b)
{
return *a == *b && (*a == '[=15=]' || 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++ 作为一种语言.
您不能将预处理器与 constexpr
函数等 C++ 功能混合搭配。
如果你想让它起作用,你需要实现你自己的 #define EQUALS
宏来完全在预处理步骤中检查字符串相等性。我不确定这是否可能(并且值得)。
我正在用 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 and this 答案)。
但是,每当我尝试创建这样的函数(或从 here or here 复制代码)时,我都会收到以下错误:
error: function-like macro 'equals' is not defined
这对我来说似乎很奇怪,因为它既不是宏也不是未定义的。我在搜索错误信息时也找不到解决方案。
完整代码供参考:
#include <iostream>
constexpr bool equals(const char* a, const char* b)
{
return *a == *b && (*a == '[=15=]' || 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++ 作为一种语言.
您不能将预处理器与 constexpr
函数等 C++ 功能混合搭配。
如果你想让它起作用,你需要实现你自己的 #define EQUALS
宏来完全在预处理步骤中检查字符串相等性。我不确定这是否可能(并且值得)。