簡體   English   中英

C中的宏調用函數返回整數然后返回一個字符串

[英]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)計算ab ,並且結果為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.

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