C++上的预处理器分析
Pre-processor parsing on C++
如果我们想使用用户输入在程序中做某事,或者打印结果,我们需要
#include <iostream>
否则,编译器不会确认cout
和cin
。但是,命令#include
是预处理器命令。当我编写程序时,发生了以下情况。我写了以下代码:
#define PRINT_DEBUG_INFO(a) {cout << “Info: ” << a << endl;}
#include <iostream>
并且没有弹出任何错误。在包含iostream
之前如何使用cout
?即使我在不包含iostream
的情况下声明PRINT_DEBUG_INFO(a)
,也不会收到编译错误。
有人可以解释我为什么会这样吗?
预处理器不需要计算任何C++声明的符号来完成其工作。
它是纯文本处理,因此定义宏如下
#define PRINT_DEBUG_INFO(a) {cout << “Info: ” << a << endl;}
并像
#include <iostream>
void foo {
int a = 5;
PRINT_DEBUG_INFO(a);
}
将成为
// All the literal stuff appearing in <iostream>
void foo {
int a = 5;
{cout << “Info: ” << a << endl;};
}
因此,在定义或扩展宏期间,不会检查任何有关正确C++语法的内容。
这些语句将由C++编译器进一步处理,编译器将抱怨cout
未在全局范围内声明。
要解决此问题,请将您的宏声明为
#define PRINT_DEBUG_INFO(a) {std::cout << “Info: ” << a << std::endl;}
你定义了PRINT_DEBUG_INFO但不使用它,所以编译器没有什么可以编译或抱怨的。
你只是在定义PRINT_DEBUG_INFO(a)
而不使用它。当您在程序中实际使用它时,您将收到未定义cout
的错误。
当您实际不使用它时,编译器找不到替换定义的常量的位置。当您实际使用它时,程序会在编译过程中展开并向您显示错误。
此外,宏中有一个括号,它用括号展开并可能导致错误。
相关文章:
- 错误:无效的预处理指令 #i 的意思是 #if?
- C++预处理会生成变量成员、资源库和映射
- 使用预处理指令检查是否包含标头?
- 预处理的 C/C++ 文件是否特定于计算机?
- 使用 GCC 对 C 文件进行部分预处理(不删除 "define" 指令)
- 在 CPLEX 中求解线性规划,无需剪切和预处理
- CPP -D 选项,用于预处理 Fortran 代码
- 错误:粘贴"tmp_UINT"和"+"未提供有效的预处理令牌
- 任务计划程序库的预处理不起作用 - 多定义错误
- Eclipse 问题 - 编译期间不考虑 .c 和 .cpp 文件中定义的预处理
- 使用python预处理后,C++(opencv)中的垫子类型数据与image_to_array相同
- Howo 使用 cl 预处理为 masm 组装生成一个单独的文件
- 我有一个预处理的 C/C++ 源文件 (cacti.i).如何从这个 .i 文件生成可执行二进制文件,以便我可以像 ./
- 如何使用Visual Studio C/C++编译器(cl.exe)来预处理我的objective-C代码
- 是具有预处理前分支实现的结构违反ODR
- 与不完整的Cholesky预处理的共轭梯度返回特征库的意外错误
- Visual Studio C - 无法输出预处理文件
- 在海湾合作委员会中加快宏观预处理的任何方法
- 所有结构成员的预处理器批处理
- 当头文件被预处理时是否有一个预处理器选项显示?