【问题标题】:How to Understand Macros-definitions unchanged如何理解宏定义不变
【发布时间】:2012-07-03 05:24:22
【问题描述】:

实际上我有一个代码,它有串行的宏

我在这里想知道的是它们是如何在代码上真正工作的,因为我想通过看到下面的结果来编写自己的预处理器,我真的很惊讶

#define int char     //macro1
#define char float   //macro2
#define float int    //macro3
main()
{
 int x;
 char y;
 float z;
}

我期望在预处理后文件中的代码是所有三个变量 x,y,z 作为 int,int,int

但令人惊讶的是(对我来说)类型没有改变,为什么会这样?谁能详细解释一下宏在预处理过程中如何发挥作用

【问题讨论】:

  • 您是否只尝试过其中之一?就像没有其他两个的'#define float int'?
  • 有各种在线资源(如gcc.gnu.org/onlinedocs/cpp/Macros.html)提供了预处理器如何工作的深入解释,特别是与宏相关的。您可能会发现阅读它们很有用...
  • 这些宏太可怕了。我希望它们不会在实际代码中使用。要回答您的问题,这可能与您输入宏的顺序有关。尝试颠倒定义的顺序,看看您会得到什么。
  • @RoeeGavirel 我已经尝试过了,但有趣的是发生了多个宏,我真正怀疑宏是如何在代码上工作的,每个宏是检查整个代码还是动态发生宏替换
  • @reuben 谢谢,这肯定会对我的项目有所帮助

标签: c c-preprocessor


【解决方案1】:

宏扩展一直持续到扩展完成,宏不能递归扩展。您定义的每个宏都扩展为另一个宏,但在扩展变为递归时停止,这意味着类型保持不变。

【讨论】:

  • 如果允许递归扩展,就没有办法阻止它。它将无限循环通过将int 更改为char 更改为float 更改为int
  • 让它不再允许循环,当它再次尝试更改时替换停止,谢谢@user315052
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 2019-10-17
  • 1970-01-01
相关资源
最近更新 更多