編譯階段打印宏內容

  對於大型C/C++工程,由於宏定義可能散落在各個頭文件和Makefile當中。同時條件編譯又是大型工程常用的技巧,所以宏定義的大量存在,給代碼閱讀增加了難度,如果搞不清楚宏定義的情況就無法掌握程序的執行流程。最簡單的辦法就是使用printf來打印這些宏,但是如果是帶參數的宏就比較麻煩了。而且如果使用printf必須重新編譯程序,並執行,當我們閱讀的是內核源碼或驅動程序,那重新執行的代價是相當可觀的。如果在編譯階段可以打印宏的內容就可以省去這些麻煩。以下內容就闡述一種可行的方法。
  首先介紹#pragma message 。 它能夠在編譯信息輸出窗口中輸出相應的信息,這對於源代碼信息的控制是非常重要的。其使用方法爲:

  #pragma message(“消息文本”)
  當編譯器遇到這條指令時就在編譯輸出窗口中將消息文本打印出來。
  當我們在程序中定義了許多宏來控制源代碼版本的時候,我們自己有可能都會忘記有沒有正確的設置這些宏,此時我們可以用這條指令在編譯的時候就進行檢查。假設我們希望判斷自己有沒有在源代碼的什麼地方定義了_X86這個宏可以用下面的方法:
  #ifdef _X86
  #pragma message(“_X86 macro activated!”)
  #endif
  當我們定義了_X86這個宏以後,應用程序在編譯時就會在編譯輸出窗口裏顯示“_X86 macro activated!”。
  有時候不僅希望知道宏是否定義了,而且希望知道宏定義的內容,#可以將宏展開爲字符串,下面的示例演示如何在編譯階段打印宏內容。
  //兩個用於測試的宏
  #define PI 3.1415926
  #define MAX(a,b) (a)>(b) ? (a) :(b)
  //首先定義兩個輔助宏
  #define   PRINT_MACRO_HELPER(x)   #x 
  #define   PRINT_MACRO(x)   #x"="PRINT_MACRO_HELPER(x) 
  //編譯階段打印宏內容
  #pragma message(PRINT_MACRO(PI))
  #pragma message(PRINT_MACRO(PI2))
  #pragma message(PRINT_MACRO(MAX(a,b)))
  #pragma message(PRINT_MACRO(MAX(x,y)))
  結果輸出
  note: #pragma message: PI=3.1415926  
  //PRINT_MACRO中的兩個x都被替換爲PI,PRINT_MACRO_HELPER中的#x替換爲宏PI的內容
  note: #pragma message: PI2=PI2          
  //PI2不存在的情況下PRINT_MACRO_HELPER將#x換做PI2
  note: #pragma message: MAX(a,b)=(a)>(b) ? (a) :(b)
  note: #pragma message: MAX(x,y)=(x)>(y) ? (x) :(y)


  以上轉自:編譯階段打印宏內容


發佈了42 篇原創文章 · 獲贊 20 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章