回覆列表
  • 1 # 南風微涼南巷靜待

    #define叫做預處理宏定義命令,它的具體作用,就是方便程式段的定義和修改,提高程式的執行效率。

      無參宏定義中,一般形式為:#define?識別符號?字串

      其中的“#”表示這是一條預處理命令。凡是以“#”開頭的均為預處理命令。“define”為宏定義命令。“識別符號”為所定義的宏名。“字串”可以是常數、表示式、格式串等。

      #definem(a+b) 它的作用是指定識別符號m來代替表示式(a+b)。在編寫源程式時,所有的(a+b)都可由m代替,而對源程式作編譯時,將先由預處理程式進行宏代換,即用(a+b)表示式去置換所有的宏名m,然後再進行編譯。

      程式1:

     #include

      #define?m?(a+b)

      int?main(vido)

      {

      int?s,a,b;

      printf("inputnumbera&b:");

      scanf("%d%d",&a,&b);

      s?=?m*m;

      printf("s=%d\n",s);

      }  對於宏定義還要說明以下幾點:

      1.宏定義是用宏名來表示一個字串,在宏展開時又以該字串取代宏名,這只是一種簡單的代換,字串中可以含任何字元,可以是常數,也可以是表示式,預處理程式對它不作任何檢查。如有錯誤,只能在編譯已被宏展開後的源程式時發現。

      2.宏定義不是說明或語句,在行末不必加分號,如加上分號則連分號也一起置換。

      3.宏定義其作用域為宏定義命令起到源程式結束。如要終止其作用域可使用#undef命令。 (有關#undef請查閱其他資料)

      宏定義優點:

      (1)方便程式的修改

      使用簡單宏定義可用宏代替一個在程式中經常使用的常量,這樣在將該常量改變時,不用對整個程式進行修改,只修改宏定義的字串即可,而且當常量比較長時,我們可以用較短的有意義的識別符號來寫程式,這樣更方便一些。我們所說的常量改變不是在程式執行期間改變,而是在程式設計期間的修改,舉一個大家比較熟悉的例子,圓周率π是在數學上常用的一個值,有時我們會用3.14來表示,有時也會用3.1415926等,這要看計算所需要的精度,如果我們編制的一個程式中要多次使用它,那麼需要確定一個數值,在本次執行中不改變,但也許後來發現程式所表現的精度有變化,需要改變它的值,這就需要修改程式中所有的相關數值,這會給我們帶來一定的不便,但如果使用宏定義,使用一個識別符號來代替,則在修改時只修改宏定義即可,還可以減少輸入3.1415926這樣長的數值多次的情況,我們可以如此定義#definepi3.1415926,既減少了輸入又便於修改,何樂而不為呢?

      (2)提高程式的執行效率

      使用帶引數的宏定義可完成函式呼叫的功能,又能減少系統開銷,提高執行效率。正如c語言中所講,函式的使用可以使程式更加模組化,便於組織,而且可重複利用,但在發生函式呼叫時,需要保留呼叫函式的現場,以便子函式執行結束後能返回繼續執行,同樣在子函式執行完後要恢復呼叫函式的現場,這都需要一定的時間,如果子函式執行的操作比較多,這種轉換時間開銷可以忽略,但如果子函式完成的功能比較少,甚至於只完成一點操作,如一個乘法語句的操作,則這部分轉換開銷就相對較大了,但使用帶引數的宏定義就不會出現這個問題,因為它是在預處理階段即進行了宏展開,在執行時不需要轉換,即在當地執行。宏定義可完成簡單的操作,但複雜的操作還是要由函式呼叫來完成,而且宏定義所佔用的目的碼空間相對較大。所以在使用時要依據具體情況來決定是否使用宏定義。

  • 中秋節和大豐收的關聯?
  • 期待和期盼有什麼區別?