[英]Multi line preprocessor macros
如何制作多行預處理器宏? 我知道如何制作一行:
#define sqr(X) (X*X)
但我需要這樣的東西:
#define someMacro(X)
class X : public otherClass
{
int foo;
void doFoo();
};
我怎樣才能讓它工作?
這只是一個例子,真正的宏可能很長。
您使用\\
作為換行符轉義符。
#define swap(a, b) { \
(a) ^= (b); \
(b) ^= (a); \
(a) ^= (b); \
}
編輯:正如@abelenky 在評論中指出的那樣, \\
字符必須是該行的最后一個字符。 如果不是(即使它之后只是空白),您將在其后的每一行上看到令人困惑的錯誤消息。
您可以通過在每行末尾放置一個反斜杠 ( \\
) 來使宏跨越多行:
#define F(x) (x) \
* \
(x)
請注意,正如 Kerrek SB 和 coaddict 指出的那樣,應該在已接受的答案中指出這一點,始終在您的論點周圍加上大括號。 sqr 示例是 CompSci 課程中教授的簡單示例。
問題是:如果你按照你的方式定義它,當你說“sqr(1+5)”時會發生什么? 你得到 "1+5*1+5" 或 11
如果你正確地在它周圍放置了大括號,# #define sqr(x) ((x)*(x))
你得到 ((1+5) * (1+5)) 或者我們想要的 36 ...漂亮。
Ed S. 將遇到與“交換”相同的問題
您需要通過用\\
轉義來轉義行尾的換行符:
#define sqr(X) \
((X)*(X))
盡管這不是原始問題的一部分,但其他答案都沒有提到嵌入在多行宏中的注釋需要仔細注意。
例子:
// WRONG:
#define someMacro(X) \
// This comment is a problem. \
class X : public otherClass \
{ \
int foo; \
void doFoo(); \
};
// WRONG:
#define someMacro(X) \
/* This comment is also \
* a problem. */ \
class X : public otherClass \
{ \
int foo; \
void doFoo(); \
};
// OK:
#define someMacro(X) \
/* This comment is fine. */ \
class X : public otherClass \
{ \
int foo; /* This is OK too! */ \
void doFoo(); \
};
我們可以像函數一樣編寫多行宏,但每個語句都以“\\”
結尾。 讓我們舉例看看。 下面是簡單的宏,它接受用戶輸入的數字,並打印輸入的數字是偶數還是奇數
#include <stdio.h>
#define MACRO(num, str) ({\
printf("%d", num);\
printf(" is");\
printf(" %s number", str);\
printf("\n");\
})
int main(void)
{
int num;
printf("Enter a number: ");
scanf("%d", &num);
if (num & 1)
MACRO(num, "Odd");
else
MACRO(num, "Even");
return 0;
}
這是 2021 年,我們真的應該朝着inline
邁進。 不正確、不必要和過度使用宏會使代碼膨脹並且難以調試(閱讀真的很難調試)
inline void foo(x)
{
// do whatever with x
}
然而,如果宏確實是一個小時的需要,用do { } while(0);
原因在這篇文章中解釋了為什么在宏中使用明顯毫無意義的 do-while 和 if-else 語句?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.