簡體   English   中英

C宏變量

[英]C Macro variable

我遇到了一個使用Macro的代碼段。 我對該宏有些困惑,需要那里的一些幫助才能理解。 由於原始代碼很長,因此我只刪除了我有疑問的部分:

以下是我有疑問的簡化代碼片段:

#define OP1(ptr, save, rail)                           \
    do {                                               \
            FIX_CONN (v, ptr, rail);                   \
        ...                                            \
    }while(0);

int main()
{ 
   int v;
   ...
   OP1(ptr, save, rail);
}

我的第一個問題是為什么要加上“;” 在while(0)之后? 我記得在宏中執行while(0)的目的是使宏正常工作。 我是否需要輸入“;”感到困惑 在while(0)之后還是之后?

我的第二個問題是關於FIX_CONN中使用的“ v”。 在此代碼中,“ v”是否從主函數傳遞?

在編譯代碼之前,C宏實際上可以用作文本替換。 因此,您不需要分號,因為在編寫宏名稱時,您將在代碼中添加分號。

由於這只是文本替換,因此您可以在調用宏時使用代碼中當前的變量。 v就是這種情況。 它沒有通過,就在那兒。

您可以讓gcc進行文本替換,以便可以看到替換文本后文件的外觀。 為此,請使用-e選項,即gcc -e -i <myFile> -o <outputFile>您可能需要注釋掉某些#inculde (除非您要讓gcc知道所有標頭在哪里)。

預編譯器會將您的代碼轉換為:

int main()
{ 
  int v;
  ...
  do {
    FIX_CONN (v, ptr, rail);
    ...
  } while (0);; // notice the two semicolons here
}

(顯然,FIX_CONN也將由宏作為預編譯器進行擴展)

; 之后while (0)是作者的錯誤。 它違反了while(0)習慣用法的目的,即使宏擴展在需要語句的任何上下文中均有效。

在這種情況下,它是無害的。 該宏用於main的末尾,其中OP1(ptr, save, rail);的擴展OP1(ptr, save, rail); 由do-while循環后跟一個空語句組成。

宏定義中的v不從main 傳遞 擴展宏時,擴展指的是v ,此時恰好可見。 如果宏是在main外部使用的,則編譯器將報告錯誤(因為未聲明v ),或者將引用其他地方定義的其他v 擁有一個在main外部定義的宏是指僅在main內部可見的宏,這無疑是一種不好的做法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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