這是有效的 C 代碼:
富.h:
#ifndef FOO_H_
#define FOO_H_
#define FUNC(var) \
do \
{ \
//something \
}while(0) \
#endif
富.c:
#include <stdio.h>
#include "foo.h"
FUNC(5); //How is it possible to call the function-like macro from here?
int main(void)
{
//do something
return 0;
}
我有一些(作業)代碼是這樣排列的,并且在全域范圍內呼叫了一個類似函式的宏。這怎么可能?
uj5u.com熱心網友回復:
我有一些(作業)代碼是這樣排列的,并且在全域范圍內呼叫了一個類似函式的宏。這怎么可能?
在檔案范圍內呼叫類似函式的宏本質上沒有任何問題。鑒于它的論點,這完全是宏替換文本的問題。您在問題中出現的類似函式的宏不能在檔案范圍內呼叫,因為它擴展為do/while陳述句,并且這些宏必須出現在函式中。無論您想到的任何示例都不能具有相同型別的替換文本。
這是一個示例,演示了可以在檔案范圍內擴展的類似函式的宏:
#include <stdio.h>
#define DECL_INT(v,i) int v = (i)
DECL_INT(var, 42);
int main(void) {
printf("%d\n", var);
}
這意味著與...完全相同的事情
#include <stdio.h>
int var = (42);
int main(void) {
printf("%d\n", var);
}
uj5u.com熱心網友回復:
編譯器將發出錯誤訊息,因為您只能將宣告放在檔案范圍內。您不得放置 do-while 陳述句。
這個宏
FUNC(5);
只是由前處理器在檔案范圍內或放置宏的位置替換此 do while 陳述句
do
{
//something
}while(0);
您似乎提取了一個不完整的代碼片段。
要使代碼有效,您需要放置此宏 FUNC(5); 在函式定義中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/464177.html
上一篇:如何在空格之間設定變數?
下一篇:揭開換行符的神秘面紗(再次)
