我不是专家,请温柔一点。这两段代码有什么区别吗?
#define BIT3 (0x1
<
<
3)
static int a;
和
#define BIT3 (0x1 << 3) static int a;
还有,有没有一种方法可以在一行中编写第一个问题?使用这种多行风格的目的是什么?以下代码好吗?
#define BIT3 (0x1 << 3)
static int a;
我不是专家,请温柔一点。这两段代码有什么区别吗?
#define BIT3 (0x1
<
<
3)
static int a;
和
#define BIT3 (0x1 << 3) static int a;
还有,有没有一种方法可以在一行中编写第一个问题?使用这种多行风格的目的是什么?以下代码好吗?
#define BIT3 (0x1 << 3)
static int a;
如果宏非常复杂,将其全部写在一行上会很难阅读,这时多行宏很有用(尽管拥有非常复杂的宏是不可取的)。
通常情况下,您可以使用换行字符\
编写多行定义。例如:
#define MY_MACRO printf( \
"I like %d types of cheese\n", \
5 \
)
但是你不能像第一个示例那样这样做。你不能这样分割标记;左移操作符<<
必须始终在没有任何分隔空格的情况下编写,否则它将被解释为两个小于运算符。所以也许:
#define BIT3 (0x1 \
<< \
3) \
static int a;
现在,它与您的第二个示例等效。
[虽然我不确定那个宏怎么可能有用!]
(0x1 << 3) static int a
会是有效语法? - Oliver Charlesworth#define BIT3 (0x1 << 3) static int a;
不是有效的语法,那么它就不是一个宏(我恐惧地想象它可能在某个地方编译)。在这种情况下,“那个宏”不能指代它,尽管你的简洁评论。 - ebyrob#define BIT3 (0x1 << 3) static int a;
是一个有效的宏定义,但它生成的代码是无效的(因此该宏没有任何用处)。 - Oliver Charlesworth\\
确实是多行宏的正确行终止符,但我可以理解提问者可能会对高级主题感到有些困惑。我不确定我是否认为一个“宏”如果不能在定义之外存在而不会编译错误就是“有效的宏”(除非生成这样的错误是其明显目的),但我偏离了主题。 - ebyrob#define fact(f,n) for (f=1; (n); (n)--) \
f*=n;
您可以使用\
字符将行分离。请注意,这不是特定于宏的。每当您想要换行时,可以在代码中添加\
字符。
printf
语句或其他语句,但你想手动换行,这时它就非常方便了。 - phoxis#define SOME_MACRO "whatever" \
"more" \
"yet more"
#define ALL_PRAGMAS
中定义几个#pragma
(每个都在自己的一行上)。 - Royi\
会有帮助吗?也许你应该开一个问题。 - Prof. Falken#pragma somePragmaA
,然后换行符#pragma somePragmaB
,然后换行符#pragma somePragmaC
。 这些都是pragma,因此每个必须在新行中。 假设您在代码中经常使用它们,因此希望创建一个单一的宏,该宏将通过预处理器展开为它们。这可行吗? - Royi
<
(小于)运算符和没有<<
(移位)运算符。还有一个类似对象的宏,值为(0x1
,后面跟着3行毫无意义的代码(它们不是宏定义的一部分;必须在这些行尾部加上反斜杠),然后是声明语句。第二个片段相当不同,但更加难以使用。(0x1 << 3)
表达式本身没问题,但接下来的static
定义只是一个语法错误;你需要在括号关闭后加上分号才有可能成功。所以它们是不同的!! - Jonathan Leffler