abs int 宏定义_在标准C中,预处理语句,特别是宏定义中,常常出现'#'和'##'符号,#字符串创建运算符#...
我看《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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 首套房贷款基准利率是多少
- 下一篇: jar包让别人看不到代码_【求助】反编译