簡體   English   中英

有沒有辦法在C預處理程序宏中“轉義”與符號?

[英]Is there a way to 'escape' an ampersand in a C preprocessor macro?

我有一個要從Windows移植到Linux的庫,並且我需要進行必要的最少更改。 庫中有一些函數調用,我需要用較少的參數來調用其變體,並且我正在嘗試使用宏來執行替換。

問題是這些調用正在傳遞結構的地址,並且出現錯誤“錯誤:“&”可能未出現在宏參數列表中”

例如,如果庫具有以下調用:

foo(param1, &param2); 

我需要替換為

foo_variant(&param2);

我在文件頂部添加了條件編譯,如下所示:

#if defined LINUX_VARIANT
    #define  foo(param1, &param2)  foo_variant(&param2)
#endif

有什么方法可以“轉義”“&”號來避免此錯誤?

如果沒有,我確實看到另一篇文章提到可以定義該結構的指針,並使用該指針而不是獲取結構的地址,但是除非沒有其他選擇,否則我想避免這種情況。 謝謝您的任何啟發!

只是轉發整個參數表達式:

#define  foo(param1, param2)  foo_variant(param2)

請注意,由於預處理器的限制,如果任何參數包含逗號,則此宏將失敗。

昆汀的答案是正確的,但要給出更多的背景知識:預處理器將以文本形式將任何foo(...替換為foo_variant(...並且還將以文本形式替換參數。如果C源文件中的一個參數使用與號,它只會將其視為參數的一部分。

因此,預處理器在其定義中不能接受與號,而在其擴展中可以接受與號。 附:

#if defined LINUX_VARIANT
    #define  foo(param1, param2)  foo_variant(&param2)
#endif

然后

foo(p1, p2);

將被替換

foo_variant(&p2);

暫無
暫無

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

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