日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C预编译处理

發布時間:2024/4/17 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C预编译处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C語言預編譯處理包含三個方面,宏定義,與及條件編譯,文件包含

1.宏定義

解析:用一個指定的標志符來代表一個字符串

#define PI 3.141592653

無參數宏定義

  • 無參數
  • 一般大寫
  • 有得于統一替換(直接修改數值,所有地方都跟著修改)
  • 末尾不能加分號(比如#define PI 3.141592653; ?程序中 float area = PI*3*3;宏展開得到結果:float area = 3.141592653;*3*3,編譯報錯)
  • 可以層層替換(宏可以使用之前已定義的宏)
  • ""號內不轉換(printf("PI is a float numer:");語句中的PI在引號""中,不進行宏展開)
  • 只作字符替換,不分配空間(相對于變量)
  • 帶參數宏定義

    #define ADD(a, b) a+b
  • 對參數字符作統一替換
  • 宏名與括號不能加空格
  • 統一替換要注意出錯,如#define AREA(r) 3.14*r*r/2原意是得到圓的面積,AREA(a+b)宏展開結果:3.14*a+b*a+b/2,與預期不符合,所以得在r上加括號#define AREA(r) 3.14*(r)*(r)/2
  • #與##

      宏定義中,#表示將兩個字符串相連,可以理解為在宏兩邊加上引號:

    #include <stdio.h> #define PRINT(w,h) printf("Your input is " #w #h "\n"); int main(int argc, char* args[]) {PRINT(3,4);return 0; }

    輸出結果為:

    Your input is 34

    帶#號參數的宏在展開后得到的結果是:

    printf("Your input is " "3" "4" "\n");

    ?

    ##表示該參數是一個變量的一部分

    #include <stdio.h> #define PRINT(w,h) printf("Your input is" #w #h "df\n"); #define VAR_PRE(name) var_##name int main(int argc, char* args[]) {PRINT(3,4); int VAR_PRE(count) = 5;printf("%d\n", VAR_PRE(count));return 0; }

    ##將name參數與var_結合,相當于往count變量趕回前綴,以區分不同的類別

    可變參數...

    C++宏定義中的可變參數表示是...,在宏定義中訪問該參數的方法是__VA_ARGS__

    #include <stdio.h> #define PRINT_ALL(...) printf(#__VA_ARGS__ "\n") int main(int argc, char* args[]) {PRINT_ALL(A, B, C);return 0; }

    輸出結果為:A, B, C

    單獨訪問具體的某一參數(這個暫時未看到方法)

    2.條件編譯

    條件編譯用告訴編譯器,某些代碼不用編譯,經常使用它來避免重復編譯:

    // common.h #ifndef COMMON_H#define COMMON_Hclass Circle {public:string r;};#endif

    場景是多處包含common.h文件,#ifndef避免編譯器對common.h進行多次編譯

    3.文件包含

      #include

  • ?一次只能引入一個文件
  • <stdio.h>和"common.h"的不同點是<>只在標準庫里面查找,common.h除了在標準庫查找外,還在用戶指定的PATH路徑進行查找編譯
  • ?

    4.宏定義的兩個用戶

    //1,防止一個頭文件被重復包含 #ifndef COMDEF_H #define COMDEF_H //頭文件內容 #endif //2,重新定義一些類型,防止由于各種平臺和編譯器的不同,而產生的類型字節數差異,方便移植。 typedef unsigned char boolean; /* Boolean value type. */ typedef unsigned long int uint32; /* Unsigned 32 bit value */ typedef unsigned short uint16; /* Unsigned 16 bit value */ typedef unsigned char uint8; /* Unsigned 8 bit value */ typedef signed long int int32; /* Signed 32 bit value */ typedef signed short int16; /* Signed 16 bit value */ typedef signed char int8; /* Signed 8 bit value */

    ?

    參考資料:

    http://www.360doc.com/content/08/0324/11/59579_1140684.shtml

    http://www.360doc.com/content/09/1009/16/59579_7027058.shtml

    轉載于:https://www.cnblogs.com/haiyupeter/archive/2012/09/01/2665146.html

    總結

    以上是生活随笔為你收集整理的C预编译处理的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。