[英]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.