日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

abs int 宏定义_在标准C中,预处理语句,特别是宏定义中,常常出现'#'和'##'符号,#字符串创建运算符#...

發(fā)布時間:2023/12/19 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 abs int 宏定义_在标准C中,预处理语句,特别是宏定义中,常常出现'#'和'##'符号,#字符串创建运算符#... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

我看《U ? N ? I ? X環(huán)境高級編程》第七章時看到這么條宏定義:

#define ? doit(name) ? pr_limits(#name, ? name)

這里第二個#號是什么意思,請各位達(dá)人賜教

在標(biāo)準(zhǔn)C中,預(yù)處理語句,特別是宏定義中,常常出現(xiàn)'#'和'##'符號

'#'是`stringize'的意思。其后的變量將被用雙引號包括的字符串替代。例:

#define ? display(x) ? show((long)(x), ? #x)

則display(abs(-5)); ? 將被替換為:show((long)(abs(-5)), ? "abs(-5)"); ? 注意有引號。

'##'是'token-paste'操作符。其后的變量將被與之前的字符串合并在一起形成一個新的token.例:

#define ? printvar(x) ? printf("%d\n", ? variable##x)

則printvar(3);將被替換為printf("%d\n", ? variable3);

##僅僅合并字符串,而形成一個token,沒有引號.

看看這個簡單的例子:

#include ?

#define ? doit(name) ? test(#name, ? name)

#define ? TEST ? 1

int ? test(char* ? name, ? int ? val)

{

printf("name ? = ? %s\n", ? name);

printf("value ? = ? %d\n", ? val);

}

int ? main()

{

doit(TEST);

}

[hua@localhost ? csdn]$ ? ./doit

name ? = ? TEST

value ? = ? 1

用cpp將doit.c預(yù)編譯得到doit.i:

[hua@localhost ? csdn]$ ? cpp ? doit.c ? > ? doit.i

[hua@localhost ? csdn]$ ? cat ? doit.i

# ? 1 ? "doit.c"

# ? 1 ? ""

# ? 1 ? ""

# ? 1 ? "doit.c"

int ? test(char* ? name, ? int ? val)

{

printf("name ? = ? %s\n", ? name);

printf("value ? = ? %d\n", ? val);

}

int ? main()

{

test("TEST", ? 1);

}

可以看到doit已經(jīng)被函數(shù)替換, ? 并且一宏的名字作為test函數(shù)的參數(shù)。

在《U ? N ? I ? X環(huán)境高級編程》也這樣一句話:

注意,在doit宏中使用了新的ANSI ? C字符串創(chuàng)建算符(#)

總結(jié)

以上是生活随笔為你收集整理的abs int 宏定义_在标准C中,预处理语句,特别是宏定义中,常常出现'#'和'##'符号,#字符串创建运算符#...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。