gpt4 book ai didi

c++ - 在 C++ 中模拟 if __name__ == __main__ 导致错误 "function-like macro is not defined"

转载 作者:行者123 更新时间:2023-11-30 03:23:59 25 4
gpt4 key购买 nike

我正在用 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 函数来比较编译时的字符串(至少根据 thisthis 回答)。

但是,每当我尝试创建这样的函数(或从 herehere 复制代码)时,我都会收到以下错误:

error: function-like macro 'equals' is not defined

这对我来说似乎很奇怪,因为它既不是宏也不是未定义的。我在搜索错误信息时也找不到解决方案。

完整代码供引用:

#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 宏,它完全在预处理步骤中检查字符串相等性。我不确定这是否可能(以及是否值得)。

关于c++ - 在 C++ 中模拟 if __name__ == __main__ 导致错误 "function-like macro is not defined",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50086636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com