在C++上进行预处理器解析

Mar*_*lic 7 c++ c-preprocessor

如果我们想使用用户输入在程序中执行某些操作,或者打印我们需要的结果

 #include <iostream>
Run Code Online (Sandbox Code Playgroud)

否则,cout并且cin将不会被compiler.However承认命令#include是预处理器命令.当我编写程序时,发生了以下情况.我写了以下代码:

#define PRINT_DEBUG_INFO(a) {cout << “Info: ” << a << endl;}
#include <iostream>
Run Code Online (Sandbox Code Playgroud)

并且没有错误弹出.如何cout在包括之前使用iostream?即使我声明PRINT_DEBUG_INFO(a)不包括 iostream,我也没有得到编译错误.
有人可以解释一下为什么会这样吗?

πάν*_*ῥεῖ 26

预处理器不需要评估任何C++声明的符号来完成其工作.

它是纯文本处理,因此定义一个宏

#define PRINT_DEBUG_INFO(a) {cout << “Info: ” << a << endl;}
Run Code Online (Sandbox Code Playgroud)

并像它一样扩展它

#include <iostream>

void foo {
  int a = 5;
  PRINT_DEBUG_INFO(a);
}
Run Code Online (Sandbox Code Playgroud)

会变成

// All the literal stuff appearing in <iostream>

void foo {
  int a = 5;
  {cout << “Info: ” << a << endl;};
}
Run Code Online (Sandbox Code Playgroud)

因此,在定义或扩展宏时,没有检查正确的C++语法.

这些语句将由C++编译器进一步处理,抱怨cout不会在全局范围内声明.

要解决此问题,请声明您的宏

#define PRINT_DEBUG_INFO(a) {std::cout << “Info: ” << a << std::endl;}
Run Code Online (Sandbox Code Playgroud)