在 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#endifpreprocessor 指令 - 预处理器作为编译步骤的一部分运行,但它不知道 C++ 作为一种语言.

您不能将预处理器与 constexpr 函数等 C++ 功能混合搭配。

如果你想让它起作用,你需要实现你自己的 #define EQUALS 宏来完全在预处理步骤中检查字符串相等性。我不确定这是否可能(并且值得)。