#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 外,您不能在函数外使用独立语句。
我今天才开始学习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 外,您不能在函数外使用独立语句。