#define 指令在 main() 函数之外不起作用

#define directives not working outside main() function

我今天才开始学习C++。到目前为止,我在其他语言方面的知识还不错,但我对#define 指令感到困惑。

我的 "review" C++ 文件中有这段代码:

#include <iostream>

#define TEST     //object-like macro

#ifdef TEST      //if TEST is defined
    std::cout << "This works!" << std::endl;
#endif

#ifndef NOT_TEST //if NOT_TEST is NOT defined
    std::wcout << "This also works!" << std::endl;
#endif

int main()
{
    //program code
}

以上代码产生错误,第一个是syntax error : mssing ';' before '<<'。当我将#define/#if 指令移动到主循环中时,它正常工作:

#include <iostream>

int main()
{
    #define TEST     //object-like macro

    #ifdef TEST      //if TEST is defined
        std::cout << "This works!" << std::endl;
    #endif

    #ifndef NOT_TEST //if NOT_TEST is NOT defined
        std::wcout << "This also works!" << std::endl;
    #endif
}

第一段代码不正确怎么办?根据我使用的教程,我认为它应该是这样格式化的?

编辑:我更新了我的代码以使其更加清晰。

你应该明白C++程序的编译是一个两步的过程。首先执行预处理器,根据您给它的指令(以 # 开头的指令)转换文件。然后在生成的文件上执行 C++ 编译器。

这里的“与预处理器相关的代码”只是#ifdef/#ifndef(条件紧随其后)和#endif关键字,实际上,您可以把它们放在任何你喜欢的地方,因为预处理器不关心 C++ 语法,它执行简单的字符串操作。

当预处理器运行时,它会将 #ifdef#endif 之间的 C++ 代码插入到文件中,因此效果与只有 cout << … 行(外部main 函数)。

因此,由于 TEST 已定义而 NOT_TEST 未定义,在预处理器完成其工作后,您留下的文件只有两行:

    std::cout << "This works!" << std::endl;

    std::wcout << "This also works!" << std::endl;

如果您尝试编译它,您会发现编译器不满意,因为这显然不是有效的 C++ 程序。

问题是在 main 函数之外使用 cout <<。 如果你想要任何输出行,你可以使用 #error 指令来中止编译过程。

这与格式化无关。事实上,C++ 文件与格式无关。问题是,在预处理器解析您的文件后,您最终会在 main 函数之外得到 2 cout 语句。在 C++ 中,除 declarations/definitions 外,您不能在函数外使用独立语句。