C++上的预处理器分析

Pre-processor parsing on C++

本文关键字:处理器 预处理 C++      更新时间:2023-10-16

如果我们想使用用户输入在程序中做某事,或者打印结果,我们需要

 #include <iostream>

否则,编译器不会确认coutcin。但是,命令#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的错误。

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

此外,宏中有一个括号,它用括号展开并可能导致错误。