【问题标题】:Multi-line DEFINE directives?多行 DEFINE 指令?
【发布时间】:2011-09-11 00:03:05
【问题描述】:

我不是专家,所以请放轻松。这两个代码段有什么区别吗?

#define BIT3 (0x1
<
<
3)
static int a;

#define BIT3 (0x1 << 3) static int a;

另外,有没有办法在一行中写第一个?这种多线样式的意义何在?下面的代码好吗?

#define BIT3 (0x1 << 3)
static int a;

【问题讨论】:

  • 第一个片段有两个连续的&lt;(小于)运算符,没有&lt;&lt;(移位)运算符。它还有一个类似对象的宏,其值为(0x1,后跟 3 行无意义的行(它们不是宏定义的一部分;为此行后面必须有反斜杠),以及宣言。第二个片段完全不同,但更无法使用。 (0x1 &lt;&lt; 3) 本身的表达式没问题,但是后面跟static 的定义只是语法错误;您需要在右括号后加一个分号才能获得战斗机会。所以他们是不同的!

标签: c++ c compiler-construction


【解决方案1】:

如果您有一个非常复杂的宏,如果它全部位于一行将难以阅读(尽管不建议使用非常复杂的宏),则多行宏很有用。

通常,您可以使用行继续符\ 编写多行定义。所以例如

#define MY_MACRO    printf( \
    "I like %d types of cheese\n", \
    5 \
    )

但是你不能在你的第一个例子中做到这一点。你不能像那样拆分令牌; &lt;&lt; 左移运算符必须始终在没有任何分隔空格的情况下编写,否则它将被解释为两个小于运算符。所以也许:

#define BIT3 (0x1 \
    << \
    3) \
    static int a;

现在相当于你的第二个例子。

[虽然我不确定那个宏会有什么用处!]

【讨论】:

  • 实际上,它来自于为不同的嵌入式设备编写跨平台代码的指南。这是“定义”第三位的安全方式,因为不同的系统可能对给定的变量类型使用不同的字节数。
  • @Adam:嗯,我不听! (0x1 &lt;&lt; 3) static int a 什么时候会是有效的语法?
  • 抱歉,我以为我会按照你的回答直到:[Although I'm not sure how that macro would ever be useful!] 我必须承认我不知道在这种情况下 that 指的是什么。如果#define BIT3 (0x1 &lt;&lt; 3) static int a; 不是有效的语法,那么它就不是宏(我不寒而栗地认为它可能会在某处编译)。在那种情况下,那个宏不能指代它,尽管你的评论很精辟。
  • @ebyrob - 这个答案已经 6 岁了,所以我也不太确定 :) 我想我是说虽然 #define BIT3 (0x1 &lt;&lt; 3) static int a; is 是一个有效的宏,它生成的代码无效(因此宏没有用处)。
  • @OliverCharlesworth 好吧,您向我展示了 `\` 确实是多行宏的正确行终止符,但我当然可以看到提问者可能对高级主题感到有些困惑。我不确定我是否会考虑一个“宏”,除了定义之外没有编译错误“一个有效的宏”(除非生成这样的错误是它的明显目的),但我离题了。
【解决方案2】:

例如:

#define fact(f,n)   for (f=1; (n); (n)--) \
                      f*=n;

您可以使用\ 字符分隔行。请注意,它不是特定于宏的。您可以在代码中添加\ 字符,只要您想换行。

【讨论】:

  • 有趣。它在宏之外有什么有用的用途吗?
  • 确实如此。就像你有很长很长的printf 或者一些语句,但是你想手动包装它,那么它就派上用场了。
  • 是的,当它不允许连接字符串常量时,它非常方便。这是不允许的:“一个字符串”“继续”。
  • @Oli Charlesworth,现在我(也许)引起了你的注意,你看到了吗:stackoverflow.com/questions/3152497/…
  • 如果我希望它包含几行怎么办?也就是说,我希望它的扩展分布在几行上?
【解决方案3】:

第一个不应该工作。行应该用反斜杠 THEN 换行分隔。像这样:

#define SOME_MACRO "whatever" \
"more" \
"yet more"

【讨论】:

  • 更重要的是,行终止符应该用反斜杠转义。如果你在反斜杠后面加一个空格,你会从预处理器中得到一些极端的嘶嘶声。
  • 如果我希望它包含几行怎么办?也就是说,我希望它的扩展分布在几行上?
  • @Royi 如果你想要的是多行字符串文字,它可以在 C++ 中完成(但不是在 C 中。)stackoverflow.com/a/5460235/193892
  • 但我需要预处理阶段的字符串,而不是程序中的字符串。考虑在一个#define ALL_PRAGMAS 中定义几个#pragma(每个都在自己的行中)。
  • @Royi,我不确定你的意思。将 `` 放在每行的末尾会有所帮助吗?也许你应该提出一个问题。
猜你喜欢
  • 1970-01-01
  • 2012-07-25
  • 2021-12-30
  • 2018-12-18
  • 2019-03-25
  • 2021-12-31
  • 1970-01-01
  • 2023-03-19
  • 2015-03-04
相关资源
最近更新 更多