簡體   English   中英

多行預處理器宏

[英]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); \
                   }

編輯:正如@a​​belenky 在評論中指出的那樣, \\字符必須是該行的最后一個字符 如果不是(即使它之后只是空白),您將在其后的每一行上看到令人困惑的錯誤消息。

您可以通過在每行末尾放置一個反斜杠 ( \\ ) 來使宏跨越多行:

#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))

盡管這不是原始問題的一部分,但其他答案都沒有提到嵌入在多行宏中的注釋需要仔細注意。

  • C++ 風格的注釋不能出現在任何具有換行符的行上。
  • C 風格的注釋不能跨越由換行符分隔的多行。

例子:

// 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM