<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 2.C語言無參數宏定義 在C語言源程序中允許用一個標識符來表示一個字符串,稱為“宏”。 被定義為“宏”的標識符稱為“宏名”。在編譯預處理時,對程序中所有出現的“宏名”,都用宏定義中的字符串去代換,這稱為“宏代換”或“宏展開”。 宏定義是由源程序中的宏定義命令完成的。宏代換是由預處理程序自動完成的。在C語言中,“宏”分為有參數和無參數兩種。本節討論無參數宏。 ## 無參宏定義 無參宏的宏名后不帶參數。其定義的一般形式為: ?? ?#define? 標識符? 字符串 其中的“#”表示這是一條預處理命令。凡是以“#”開頭的均為預處理命令。“define”為宏定義命令。“標識符”為所定義的宏名。“字符串”可以是常數、表達式、格式串等。 在前面介紹過的符號常量的定義就是一種無參宏定義。此外,常對程序中反復使用的表達式進行宏定義。例如: ~~~ #define M (y*y+3*y) ~~~ 它的作用是指定標識符M來代替表達式(y*y+3*y)。在編寫源程序時,所有的(y*y+3*y)都可由M代替,而對源程序作編譯時,將先由預處理程序進行宏代換,即用(y*y+3*y)表達式去置換所有的宏名M,然后再進行編譯。 【例9-1】 ~~~ #define M (y*y+3*y) main(){ int s,y; printf("input a number: "); scanf("%d",&y); s=3*M+4*M+5*M; printf("s=%d\n",s); } ~~~ 上例程序中首先進行宏定義,定義M來替代表達式(y*y+3*y),在s=3*M+4*M+5* M中作了宏調用。在預處理時經宏展開后該語句變為: ~~~ s=3*(y*y+3*y)+4*(y*y+3*y)+5*(y*y+3*y); ~~~ 但要注意的是,在宏定義中表達式(y*y+3*y)兩邊的括號不能少。否則會發生錯誤。如當作以下定義后: ~~~ #difine M y*y+3*y ~~~ 在宏展開時將得到下述語句: ~~~ s=3*y*y+3*y+4*y*y+3*y+5*y*y+3*y; ~~~ 這相當于: ? ? 3y2+3y+4y2+3y+5y2+3y 顯然與原題意要求不符。計算結果當然是錯誤的。因此在作宏定義時必須十分注意。應保證在宏代換之后不發生錯誤。 對于宏定義還要說明以下幾點: 1) 宏定義是用宏名來表示一個字符串,在宏展開時又以該字符串取代宏名,這只是一種簡單的代換,字符串中可以含任何字符,可以是常數,也可以是表達式,預處理程序對它不作任何檢查。如有錯誤,只能在編譯已被宏展開后的源程序時發現。 2) 宏定義不是說明或語句,在行末不必加分號,如加上分號則連分號也一起置換。 3) 宏定義必須寫在函數之外,其作用域為宏定義命令起到源程序結束。如要終止其作用域可使用#undef命令。例如: ~~~ #define PI 3.14159 main(){ /* …… */ } #undef PI f1(){ /* …… */ } ~~~ 表示PI只在main函數中有效,在f1中無效。 4) 宏名在源程序中若用引號括起來,則預處理程序不對其作宏代換。如下所示(【例92】): ~~~ #define OK 100 main(){ printf("OK"); printf("\n"); } ~~~ 上例中定義宏名OK表示100,但在printf語句中OK被引號括起來,因此不作宏代換。程序的運行結果為:OK這表示把“OK”當字符串處理。 5) 宏定義允許嵌套,在宏定義的字符串中可以使用已經定義的宏名。在宏展開時由預處理程序層層代換。例如: ~~~ #define PI 3.1415926 #define S PI*y*y /* PI是已定義的宏名*/ ~~~ 對語句: ~~~ printf("%f",S); ~~~ 在宏代換后變為: ~~~ printf("%f",3.1415926*y*y); ~~~ 6) 習慣上宏名用大寫字母表示,以便于與變量區別。但也允許用小寫字母。 7) 可用宏定義表示數據類型,使書寫方便。例如: ~~~ #define STU struct stu ~~~ 在程序中可用STU作變量說明: ~~~ STU body[5],*p; #define INTEGER int ~~~ 在程序中即可用INTEGER作整型變量說明: ~~~ INTEGER a,b; ~~~ 應注意用宏定義表示數據類型和用typedef定義數據說明符的區別。宏定義只是簡單的字符串代換,是在預處理完成的,而typedef是在編譯時處理的,它不是作簡單的代換,而是對類型說明符重新命名。被命名的標識符具有類型定義說明的功能。 請看下面的例子: ~~~ #define PIN1 int * typedef (int *) PIN2; ~~~ 從形式上看這兩者相似, 但在實際使用中卻不相同。 下面用PIN1,PIN2說明變量時就可以看出它們的區別: ~~~ PIN1 a,b; ~~~ 在宏代換后變成: ~~~ int *a,b; ~~~ 表示a是指向整型的指針變量,而b是整型變量。然而: ~~~ PIN2 a,b; ~~~ 表示a、b都是指向整型的指針變量。因為PIN2是一個類型說明符。由這個例子可見,宏定義雖然也可表示數據類型, 但畢竟是作字符代換。在使用時要分外小心,以避出錯。 8) 對“輸出格式”作宏定義,可以減少書寫麻煩。 【例9-3】中就采用了這種方法。 ~~~ #define P printf #define D "%d\n" #define F "%f\n" main(){ int a=5, c=8, e=11; float b=3.8, d=9.7, f=21.08; P(D F,a,b); P(D F,c,d); P(D F,e,f); } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看