【问题标题】:Type macros in C++ [closed]在 C++ 中键入宏 [关闭]
【发布时间】:2018-01-17 02:41:01
【问题描述】:
     #define int double
     #define double int


     int a = 5.5;
     double f = 5.5;

     cout << a << " " << f << endl;

下面的代码sn-p实际输出5 5.5,表示int实际表示int,double实际表示double。

我想知道这有什么意义? 我可以同时相信 int 和双重含义 int,如果定义是一个接一个地执行,或者它们中的两个改变它们的含义(如果它们都同时执行),但我找不到这种行为的正确解释。

为什么会这样?

【问题讨论】:

  • 你不明白预处理器是如何工作的吗?
  • 我不知道,这就是为什么我请求解释。
  • 我真的没有看到关于数据类型的知识和关于宏替换中的非递归限制的知识之间的相关性,对不起。
  • FWIW,您的示例具有未定义的行为,因为它重新定义了关键字并包含标准标题。也就是说,我所知道的所有编译器都会像对待任何其他宏一样对待它。

标签: c++ macros int double


【解决方案1】:

当预处理器替换宏时,一旦准备好宏替换列表,就会重新扫描以获得更多宏替换机会。但是,此过程不允许递归替换。

在你的情况下

int a = 5.5;

int 被视为宏名称。它的替换列表是double。重新扫描此替换以获取更多宏。找到宏名称 double 并将其替换为 int。再次重新扫描此结果以获取更多宏。再次找到宏名称int,但这次它没有被替换,因为“无递归”规则阻止了它。此时重新扫描过程停止。您原来的 int 将被宏替换为 int。因此,实际上没有任何改变。

double 也会发生同样的事情。以同样的方式,double 最终被 double 取代。


这与允许我们定义与现有函数名称匹配的宏名称基本相同的功能。即

#define fgets fgets

当我们这样做时,这不会导致无限递归替换

fgets(buffer, sizeof buffer, stdin);

宏只被替换一次。

【讨论】:

  • 另外值得指出的是,预处理宏是简单的字符串替换。它们不尊重命名空间,并且可能很容易与其他标识符发生冲突(例如 OP 示例中的冲突!)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-30
  • 2023-04-08
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
  • 2021-10-25
  • 1970-01-01
相关资源
最近更新 更多