[英]Macro in C to call a function returning integer and then return a string
我有一個返回整數值的函數。 現在我想編寫一個調用此函數的宏,獲取返回值並在其前面添加一個字符串並返回結果字符串。
我試過這個:
#define TEST(x) is_enabled(x)
我在main函數中將此宏稱為:
int ret = 0;
ret = TEST(2);
printf("PORT-%d\n", ret);
這非常有效。 但是我希望宏返回字符串PORT-x,其中,x是被調用函數的返回值。 我怎樣才能做到這一點?
編輯:
我也嘗試將它寫成多行:
#define TEST(x)\
{\
is_enabled(x);\
}
並在主函數中將其稱為:
printf("PORT-%d\n", TEST(2));
但這會產生編譯時錯誤:
error: expected expression before â{â token
使用函數,而不是宏。 這里沒有充分的理由使用宏。
你可以使用sprintf(3)
,與malloc或緩沖區結合來解決它。 有關詳細信息,請參閱創建C格式化字符串(不打印它們)或手冊頁。
關於你的編輯:你不需要在宏中使用大括號{}
,它們會導致你的錯誤,因為預處理會把它翻譯成像
printf("format%d", {
is_enabled(x);
});
要更好地理解宏,請使用-E標志運行gcc或clang,或嘗試閱讀本文: http : //en.wikipedia.org/wiki/C_preprocessor
這有點痛苦,因為你需要確保字符串的存儲空間。 老實說,現在的宏只能用於條件編譯。
使用枚舉類型更好地完成常量,並且宏函數通常更好地作為內聯函數(知道inline
是對編譯器的建議 ,而不是需求)。
如果您堅持使用宏,則可以使用靜態存儲來完成存儲,但如果您正在使用它們,則會出現線程問題,並且延遲/多次使用返回的字符串。
您也可以動態分配字符串,但是在完成后必須釋放它,並處理內存不足的情況。
也許最簡單的方法是要求宏用戶提供自己的存儲,順序如下:
#include <stdio.h>
#define TEST2_STR(b,p) (sprintf(b,"PORT-%d",p),b)
int main (void) {
char buff[20];
puts (TEST2_STR(buff, 42));
return 0;
}
哪個輸出:
PORT-42
如果宏看起來有點混亂,它會使用逗號運算符,其中表達式(a, b)
計算a
和b
,並且結果為b
。
在這種情況下,它評估sprintf
(填充緩沖區)然后“返回”緩沖區。 而且,即使你認為你以前從未見過,你可能錯了:
for (i = 0, j = 9; i < 10; i++, j--)
xyzzy[i] = plugh[j];
盡管大多數人認為這是for
的一個特征,但它可以在許多不同的地方使用,它是一個非常不同的結構:
int i, j, k;
i = 7, j = 4, k = 42;
while (puts("Hello, world"),sleep(1),1);
(等等)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.