[英]Is there a way to 'escape' an ampersand in a C preprocessor macro?
我有一個要從Windows移植到Linux的庫,並且我需要進行必要的最少更改。 庫中有一些函數調用,我需要用較少的參數來調用其變體,並且我正在嘗試使用宏來執行替換。
問題是這些調用正在傳遞結構的地址,並且出現錯誤“錯誤:“&”可能未出現在宏參數列表中”
例如,如果庫具有以下調用:
foo(param1, ¶m2);
我需要替換為
foo_variant(¶m2);
我在文件頂部添加了條件編譯,如下所示:
#if defined LINUX_VARIANT
#define foo(param1, ¶m2) foo_variant(¶m2)
#endif
有什么方法可以“轉義”“&”號來避免此錯誤?
如果沒有,我確實看到另一篇文章提到可以定義該結構的指針,並使用該指針而不是獲取結構的地址,但是除非沒有其他選擇,否則我想避免這種情況。 謝謝您的任何啟發!
只是轉發整個參數表達式:
#define foo(param1, param2) foo_variant(param2)
請注意,由於預處理器的限制,如果任何參數包含逗號,則此宏將失敗。
昆汀的答案是正確的,但要給出更多的背景知識:預處理器將以文本形式將任何foo(...
替換為foo_variant(...
並且還將以文本形式替換參數。如果C源文件中的一個參數使用與號,它只會將其視為參數的一部分。
因此,預處理器在其定義中不能接受與號,而在其擴展中可以接受與號。 附:
#if defined LINUX_VARIANT
#define foo(param1, param2) foo_variant(¶m2)
#endif
然后
foo(p1, p2);
將被替換
foo_variant(&p2);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.