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

标签 c++ macros constexpr clang++ entry-point

我正在用 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/

相关文章:

c++ - 这个foreach宏实现有没有问题

c++ - 松散常量表达式中 union 非事件成员的左值到右值转换的解决方法

c++ - 如何使用谷歌测试用例测试迭代器值?

c++ - DPI 意识真的需要吗?

C++定义可变宏

c++ - 我应该在 Xcode 的什么地方定义 DISALLOW_COPY_AND_ASSIGN 宏

C++:最常见的漏洞是什么以及如何避免它们?

c++ - Qt5:如何在本地文件系统中读取/写入文件

c++ - 使用 constexpr 绕过重新解释强制转换限制

c++ - GCC constexpr constexpr 函数中的 lambdas 和编译时的评估