多行DEFINE指令?

Ada*_*m S 51 c c++ compiler-construction

我不是专家,所以对我很轻松.这两个代码段之间是否有任何差异?

#define BIT3 (0x1
<
<
3)
static int a;
Run Code Online (Sandbox Code Playgroud)

#define BIT3 (0x1 << 3) static int a;
Run Code Online (Sandbox Code Playgroud)

还有,有没有办法在一行中写第一个?这种多线风格有什么意义?以下代码是否良好?

#define BIT3 (0x1 << 3)
static int a;
Run Code Online (Sandbox Code Playgroud)

Oli*_*rth 82

如果你有一个非常复杂的宏,如果它只在一行上很难读取,那么多行宏很有用(虽然不建议使用非常复杂的宏).

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

#define MY_MACRO    printf( \
    "I like %d types of cheese\n", \
    5 \
    )
Run Code Online (Sandbox Code Playgroud)

但是你不能用你的第一个例子做到这一点.你不能这样分割令牌; 该<<左移操作人员必须始终没有任何空格分开写,否则会被解释为两个低于运营商.也许:

#define BIT3 (0x1 \
    << \
    3) \
    static int a;
Run Code Online (Sandbox Code Playgroud)

这相当于你的第二个例子.

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

  • @Adam:嗯,我不跟着!``(0x1 << 3)static int a`何时才是有效的语法? (6认同)

pho*_*xis 21

例如:

#define fact(f,n)   for (f=1; (n); (n)--) \
                      f*=n;
Run Code Online (Sandbox Code Playgroud)

您可以使用\角色分隔线条.请注意,它不是特定于宏的.\只要您希望打破一条长线,就可以在代码中添加该字符.

  • 是的,当不允许连接字符串常量时返回,它非常方便.这是不允许的:"一个字符串""继续". (2认同)

Pro*_*ica 6

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

#define SOME_MACRO "whatever" \
"more" \
"yet more"
Run Code Online (Sandbox Code Playgroud)

  • 更重要的是,行终止符应该使用反斜杠进行转义.如果你在反斜杠之后放置一个空格,你将从预处理器中获得一些极端的混合. (4认同)