C++ 在c+中模拟if uuuu name uuuuuuu===uuu main uuuuuuuu+;“导致错误”;“未定义类似宏的函数”;

C++ 在c+中模拟if uuuu name uuuuuuu===uuu main uuuuuuuu+;“导致错误”;“未定义类似宏的函数”;,c++,macros,constexpr,clang++,entry-point,C++,Macros,Constexpr,Clang++,Entry Point,我正在用bash编写一个简单的构建文件,它可以通过模拟Python的 if __name__ == __main__: main() 我的想法是通过将-D\uu MAIN\uuu=\“$MAIN\u FILE\”传递到clang++,其中MAIN\u FILE是您在运行构建脚本时指定的文件。然后,我只需将宏\uuuuu MAIN\uuuuuu与每个源文件的预定义标准宏\uuuuuuu进行比较。大概是这样的: #if equals(__FILE__, __MAIN__) int

我正在用bash编写一个简单的构建文件,它可以通过模拟Python的

if __name__ == __main__:
    main()
我的想法是通过将
-D\uu MAIN\uuu=\“$MAIN\u FILE\”
传递到clang++,其中
MAIN\u FILE
是您在运行构建脚本时指定的文件。然后,我只需将宏
\uuuuu MAIN\uuuuuu
与每个源文件的预定义标准宏
\uuuuuuu
进行比较。大概是这样的:

#if equals(__FILE__, __MAIN__)
    int main()
    {
        /* code */
        return 0;
    }
#endif
我遇到的问题是使函数
等于
在编译时工作。读到这里,似乎应该可以定义一个constexpr函数,在编译时比较字符串(至少根据和答案)

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

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

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

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

#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
什么导致了这个错误,我是如何解决我的问题的?< /强>

< p> <代码> >如果和< >代码> NEDF< /CUD>是<强>预处理器指令-预处理器作为编译步骤的一部分运行,但它不知道C++作为一种语言。

不能将预处理器与C++特性混合和匹配,如<代码> CONTXPRP</代码>函数。


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

标识符
\uuuu MAIN\uuuu
是保留的,您不能使用它。还有,你确定你真的想这么做吗?Python模块比共享的库更好,而不是单独的C++源文件;无论您实际想要实现什么,可能都可以用更好的方法来实现。既然您知道
\uuuuuu MAIN\uuuu
的值设置为哪个文件,为什么不只为该文件设置
\uuuuu MAIN\uuuuu
,并使用简单的
\ifdef\uuu MAIN\uu#endif
?另外,.Related:这不是正确的方法。。。只需在编译目标中的库文件中包含正确的主文件。不同的语言,不同的范例,这种范例应该留在python中。@BaummitAugen我不确定这是最好的方式,但我经常遇到这样的情况,我想改变入口点,就像我在python中所做的那样,所以这似乎是一种自然的方式。不过,我确信有更好的选择,我也很乐意听到这些选择,尽管答案似乎表明这是可能的。是错了还是我遗漏了什么?好的,谢谢你的回答!另外,感谢您在CppCon上就实体组件系统进行的演讲^^
clang++ main.cpp -std=c++14 -D __MAIN__="fullpath/main.cpp"