首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >仿真__name__ == __main__在c++中是否导致错误“类函数宏未定义”

仿真__name__ == __main__在c++中是否导致错误“类函数宏未定义”
EN

Stack Overflow用户
提问于 2018-04-29 12:37:30
回答 1查看 1.6K关注 0票数 1

我正在用bash编写一个简单的构建文件,这将使我很容易通过模拟Python的入口点切换入口点。

代码语言:javascript
复制
if __name__ == '__main__':
    main()

我的想法是通过将-D __MAIN__=\"$MAIN_FILE\"传递给clang++来包含宏,其中MAIN_FILE是在运行构建脚本时指定的文件。然后,我只需将宏__MAIN__与每个源文件的预定义的标准宏__FILE__进行比较。就像这样:

代码语言:javascript
复制
#if equals(__FILE__, __MAIN__)
    int main()
    {
        /* code */
        return 0;
    }
#endif

我遇到的问题是如何使函数equals在编译时工作。对此进行阅读,似乎应该可以定义一个用于比较编译时字符串(至少根据thisthis的答案)的constexpr函数。

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

错误:未定义类似函数的宏“等于”

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

以下是供参考的完整代码:

代码语言:javascript
复制
#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

编撰:

代码语言:javascript
复制
clang++ main.cpp -std=c++14 -D __MAIN__="fullpath/main.cpp"

是什么导致了这个错误,我如何解决我的问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-29 12:43:38

#if#endif预处理器指令--预处理器作为编译步骤的一部分运行,但它并不知道C++是一种语言。

不能将预处理器与C++功能(如constexpr函数)混合和匹配。

如果希望这样做,则需要实现自己的#define EQUALS宏,该宏在预处理步骤中完全检查字符串相等。我不确定这是否可能(也不值得)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50086636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档