在 C++ 中模拟 if __name__ == __main__ 会导致错误“未定义类似函数的宏”

问题描述 投票:0回答:3

我正在用 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复制代码)时,我都会收到以下错误:

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

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

以下是完整代码供参考:

#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"

导致此错误的原因是什么以及如何解决我的问题?

c++ macros constexpr clang++ entry-point
3个回答
3
投票

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

您不能将预处理器与 C++ 功能(例如

constexpr
函数)混合搭配。

如果您希望它起作用,您需要实现自己的

#define EQUALS
宏,以在预处理步骤中完全检查字符串相等性。我不确定这是否可能(并且值得)。


0
投票

我想在编译器参数中为 EXP: -D InSingleFileTest 设置一个类似“InSingleFileTest”的标志,而我正在单个文件测试中。并使用类似:

#ifdef InSingleFileTest
int main(...){};
#endif

也许这是 C++ 中进行单个文件测试的标准方法。


0
投票

你可以这样做:

void func()
{

}

#if __INCLUDE_LEVEL__ == 0
int main()
{
    func();
}
#endif

这将起作用,因为仅当不包含该文件时才会定义

main
。 使用 gcc 和 clang 进行测试。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.