[源碼下載]
作者:webabcd
介紹
不可或缺 Windows Native 之 C 語言
示例
1、預處理命令
cPreprocessor.h
#ifndef _MYHEAD_PREPROCESSOR_ #define _MYHEAD_PREPROCESSOR_ #ifdef __cplusplus extern "C" #endif char *demo_cPreprocessor(); #endif
cPreprocessor.c
/* * 預處理命令 * * 以“#”開頭的就是預處理命令(預處理命令不用“;”結尾),其是指在編譯之前所做的工作 */ #include "pch.h" #include "cPreprocessor.h" #include "cHelper.h" // #define - 宏定義命令,在編譯預處理時,對程序中所有出現的“宏名”,都用宏定義中的字符串去代換,這稱為“宏代換”或“宏展開” #define PI 1000 // #define 標識符 字符串 #define S PI * r * r // 一個宏也可以引用另一個宏 #define S2(r) PI * r * r // 宏是可以帶參數的 #define PI 3.14 // 宏重名的話,後面的會替換前面的 #define INTEGER int // 宏定義當然也可以定義數據類型,因為其本質就是拿一個字符串替換另一個字符串 #define ISWINDOWS 1 #define X(n) n == 0 ? 0 \ : -1 // 一個長的 #define 可以用“\”分成多行 // 說到這裡再插一句,單行注釋的話 \ 以“\”結尾則下一行也為注釋 \ 另外:ANSI C 只支持“/**/”注釋,而不支持“//”注釋 /* 再強調一遍,宏定義的本質就是拿一個字符串替換另一個字符串 如果是 #define x 1 + 2 那麼表達式 3 * x * 4 就相當於 3 * 1 + 2 * 4,結果是 11 如果是 #define x (1 + 2) 那麼表達式 3 * x * 4 就相當於 3 * (1 + 2) * 4,結果是 36 */ /* #include - 文件包含命令 #include "stdio.h" 使用雙引號表示首先在文件當前目錄中查找(支持絕對路徑和相對路徑),若未找到則到包含目錄中去查找 #include <math.h> 使用尖括號表示在包含文件目錄中去查找,而不在文件當前目錄去查找 包含文件目錄的設置:項目 -> 右鍵 -> 屬性 -> 配置屬性 -> VC++ 目錄 -> 包含目錄 */ char *demo_cPreprocessor() { INTEGER r = 2; // 宏展開其相當於 int r = 2; float x = S; // 宏展開其相當於 3.14 * r * r,即 3.14 * 2 * 2 float y = S2(2); // 宏展開其相當於 3.14 * 2 * 2 int z = X(100); // -1 // 條件編譯命令有:#ifdef, #else, #endif, #ifndef, #if #ifdef PI // 如果在宏定義中定義了 PI(ifdef 是 if defined 的簡寫) ; #else // 如果不需要的話,可以不要 #else ; #endif // #ifdef 和 #endif 必須成對 #ifndef PI // 如果在宏定義中沒有定義 PI(ifndef 是 if not defined 的簡寫) ; #else // 如果不需要的話,可以不要 #else ; #endif // #ifndef 和 #endif 必須成對 #if ISWINDOWS // 如果宏定義 ISWINDOWS 非零則為真(ISWINDOWS 是整型) ; #else // 如果不需要的話,可以不要 #else ; #endif // #if 和 #endif 必須成對 return float_toString(y); } // 這之後不再有 PI 這個宏定義(undef 是 undefine 的簡寫) #undef PI
2、輸入和輸出
cIO.h
#ifndef _MYHEAD_IO_ #define _MYHEAD_IO_ #ifdef __cplusplus extern "C" #endif char *demo_cIO(); #endif
cIO.c
/* * 輸入,輸出 */ #include "pch.h" #include "cIO.h" #include "cHelper.h" void io_printf(); void io_scanf(); void io_getchar(); char *demo_cIO() { // 格式化輸出 printf io_printf(); // 格式化輸入 scanf io_scanf(); // 字符串輸入 getchar() io_getchar(); return "看代碼及注釋吧"; } // 格式化輸出 printf void io_printf() { // printf - print formatted,以下僅列一下常用用法 // printf 的返回值為:實際輸出的字符數 int a = 88; float b = 3.14159; char *c = "webabcd wanglei"; // %d - 以十進制形式輸出帶符號整數 // %.2f - 以浮點型輸出,取小數點後 2 位 // %.7s - 以字符串輸出,取前 7 位 printf("%d, %.2f, %.7s\n", a, b, c); // 輸出結果:88, 3.14, webabcd // printf 的返回值為 18 // %o - 以八進制形式輸出無符號整數 // %#o - 以八進制形式輸出無符號整數,並加前綴 0 printf("%o, %#o\n", a, a); // 輸出結果:130, 0130 // %x 或 %X - 以十六進制形式輸出無符號整數 // %#x - 以八進制形式輸出無符號整數,並加前綴 0x // %#X - 以八進制形式輸出無符號整數,並加前綴 0X printf("%x, %#x, %#X\n", a, a, a); // 輸出結果:58, 0x58, 0X58 // %10.2f - 以浮點型輸出,取小數點後 2 位;顯示寬度至少為 10 位,不夠以空格填充 printf("%10.2f\n", b); // 輸出結果: 3.14(前面有 6 個空格) /* * 類型說明如下: * %d / %i - 整型 * %o - 無符號八進制 * %u - 無符號十進制 * %x / %X - 無符號十六進制 * %f - 浮點型 * %e / %E - 科學表示法 * %g / %G - 在 %f 和 %e/%E 之中選一個最短的形式 * %c - 字符 * %s / %S - 按字符串輸出,直至'\0' * %p - 以十六進制形式輸出指針 * %% - % * * * 另外有兩種長度格式: * h - 按短整型量輸出,比如:%hd - 按短整型輸出; printf("%hd", 32769) 輸出結果為 -32767 * l - 按長整型量輸出,比如:%lf - 按 double 輸出; %ld - long int; %lld - long long int */ } // 格式化輸入 scanf void io_scanf() { // scanf - scan formatted,以下僅列一下常用用法 // printf 的返回值為:成功接收到的賦值參數的個數 int a; float b; char c[100]; // %2s - 代表輸入字符串時,只取前 2 位 // 如果在兩個格式化參數之間沒有它字符的話,則可用空格或TAB或回車做間隔 scanf("%d%f%2s", &a, &b, c); // 輸入 1 3.14 webabcd 後的結果為:a 的值為 1,b 的值為 3.14,c 的前 3 個元素為 'w' 'e' '\0' // scanf 的返回值為 3 // 如果在兩個格式化參數之間有它字符的話,則按指定的字符做間隔 scanf("a=%d, b=%f, c=%s", &a, &b, c); // 輸入:a=1, b=3.14, c=webabcd } // 字符串輸入 getchar() void io_getchar() { // 當程序調用 getchar() 函數時,程序就等著用戶按鍵,用戶輸入的字符被存放在鍵盤緩沖區中,直到用戶按回車為止(回車字符也放在緩沖區中) // 當用戶鍵入回車之後,getchar() 函數才開始從鍵盤緩沖區中每次讀入一個字符,一直到緩沖區中的字符讀完 /* char c = NULL; while ((c == getchar()) != '\n') { printf("%c", c); } */ // getch(), getche() 之類的需要 conio.h, 但是在 linux 下是沒有的,所以就不寫了 }
OK
[源碼下載]