適用場景舉例
流媒體處理系統中,採樣率是個很重要的參數,很多地方都要用,如果用來分配內存,則
#define SAMPLE_RATE 16000
如果用來配置第三方庫,則
#define SAMPLE_RATE "16000"
這樣每次改採樣率都要改兩處地方,容易遺漏
網上搜到第一篇文章,匆忙試了試,並未達到我想要的效果,然後在GNU的官網找到了第二篇文章,看懂了,原來第一篇文章的技巧(也是翻譯第二篇文章的)僅適用於宏函數的場景
還好天無絕人之路,第二篇文章末尾3段,講述了實現我想要效果的方法,就是二級stringfication
#include <stdio.h>
#define SAMPLE_RATE 16000
#define STR1(R) #R
#define STR2(R) STR1(R)
int main()
{
printf("sample rate = " STR2(SAMPLE_RATE) "\n");
return 0;
}
運行輸出
sample rate = 16000
注意:
二級stringfication會將宏定義原樣輸出,即,如果16000加上括弧(有經驗的程序員都懂),則STR2輸出的也是帶括弧的字符串,這通常不是你想要的
可以這樣繞過:
給SAMPLE_RATE定義一個別名,並給別名加上括弧,在需要整型時用別名,在需要字符串時用原名
#include <stdio.h>
#define SAMPLE_RATE_CONFIG 16000
#define SAMPLE_RATE (SAMPLE_RATE_CONFIG)
#define STR1(R) #R
#define STR2(R) STR1(R)
int main()
{
printf("sample rate = %d\n", SAMPLE_RATE);
printf("sample rate config = %s\n", STR2(SAMPLE_RATE_CONFIG));
return 0;
}
運行輸出
sample rate = 16000
sample rate config = 16000