簡體   English   中英

在引用的字符串中擴展宏變量

[英]expanding macro variable within quoted string

我在c中的兩本着名書籍中找到了兩個不同的東西,第一個是“宏觀擴展中的引用字符串中沒有替換形式參數” - 由K&R c語言第76頁

第二個是代碼,

#define PRINT(var,format) printf("variable is %format\n",var)
PRINT(x_var,f);

稍后的宏調用將擴展為

printf("x_var is %f\n",x_var);
  • 這是通過在第448頁的ansi c - E. balagurusamy編程。

當然有兩個引用是相互矛盾的。 到目前為止,我知道第一個是真的,我的編譯器給我的結果如此。 但第二本書也是眾所周知和受歡迎的。 我想知道在先前版本的c中是否有這樣的東西,或者第二次引用是假的。

第二本書是錯誤的: 很容易檢查宏不會像那樣擴展。 但是,你可以得到他們使用令牌字符串化描述的效果#預處理程序操作:

#define PRINT(var,format) printf(#var" is %"#format"\n",var)

現在您可以按如下方式打印變量:

int xyz = 123;
PRINT(xyz, d);

這是一個關於ideone的工作示例的鏈接

請注意在'#format'之前和之后添加雙引號,在'var'和'format'之前添加'#'。 '#'運算符使變量的值成為帶引號的字符串 - 帶有雙引號。 這使得替換的字符串成為一行中的四個帶引號的字符串,C編譯器將其識別為連接成一個字符串的請求。 因此字符串:“xyz”,“is%”,“d”和“\\ n”連接成:“xyz is%d \\ n”

(注意,此示例與原始問題中的示例的不同之處在於,orignal示例具有“variable is ...”,其中答案將'variable'替換為'var'宏參數的實例)

這本書是對的。 這是時候了。 我寫了一個小的測試程序來驗證它(你不欣賞文本編輯器,直到你已經設定ed ):

#define PRINT(fmt,val) printf("val = %fmt\n", (val))
main()
{
    int x;
    x = 5;
    PRINT(d, x);
}

我在運行Unix V6的PDP-11上編譯它。 運行該程序會產生以下輸出:

x = 5

這甚至在K&R C之前。“特征”在C的后續迭代中被刪除,並在ISO C90中正式生效。

暫無
暫無

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

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