宏定義。字符串拼接和字符串整形轉字符串


#include <stdio.h>

#define A  ".5.6"
#define SAMPLE_RATE_CONFIG 5

#define STR1(R)  #R
#define STR3(R)  STR1(R) A

#define STR4    STR3(SAMPLE_RATE_CONFIG)

int main()
{

      printf("same rate config = %s\n", STR4 );
      return 0;
}

結果如下

預編譯之后如下 
int main()
{

      printf("same rate config = %s\n", "5" ".5.6" );
      return 0;
}

結果如下:
same rate config = 5.5.6

 

適用場景舉例

流媒體處理系統中,采樣率是個很重要的參數,很多地方都要用,如果用來分配內存,則

#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



拼接

最近在編寫一個項目的代碼時,需要在宏定義中連接多個字符串,具體來說就是,先定義一個軟件版本號,然后再定義一個硬件版本號, 然后再將他們拼合起來生成一個綜合版本號。這些動作我都希望在宏定義中直接完成,提供代碼的可讀性和可移植性。

類似於下面這樣的:

#define SOFTWARE_VERSION "Software:V1.00"
#define HARDWARE_VERSION "Hardware:V1.00"
#define SYSTEM_VERSION ????

但是,經過實際測試,以上的代碼,只能用於KEIL/ADS/IAR等集成編譯環境中。如果是在linux下,使用gcc編譯器的話,上述代碼就會出錯,目前尚未查出具體原因。經過一番折騰后,發現gcc環境下,如果要連接多個字符串,直接使用空格連接就行了。所以將其改為如下語句就可以了:

#define SOFTWARE_VERSION "Software:V1.00"
#define HARDWARE_VERSION "Hardware:V1.00"
#define SYSTEM_VERSION SOFTWARE_VERSION HARDWARE_VERSION

keil 

#define SOFTWARE_VERSION "Software:V1.00"
#define HARDWARE_VERSION "Hardware:V1.00"
#define SYSTEM_VERSION SOFTWARE_VERSION##" "##HARDWARE_VERSION

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM