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

时间:2017-01-28 15:03:58

标签: c++ c-preprocessor

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

 #include <iostream>

否则,编译器将不会确认coutcin。但是命令#include是预处理器命令。当我编写程序时,发生了以下情况。我写了以下代码:

#define PRINT_DEBUG_INFO(a) {cout << “Info: ” << a << endl;}
#include <iostream>

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

3 个答案:

答案 0 :(得分:26)

预处理器不需要评估任何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;}

答案 1 :(得分:3)

您定义PRINT_DEBUG_INFO但不使用它,因此编译器无需编译或抱怨。

答案 2 :(得分:2)

您只是定义PRINT_DEBUG_INFO(a)而不是使用它。当您在程序中实际使用它时,您将收到cout未定义的错误。

当您实际不使用它时,编译器找不到替换定义的常量的位置。当您实际使用它时,程序在编译期间会扩展并显示错误。

而且你的宏中有一个括号,它用括号展开,可能会导致错误。