C++學習(二十七)(C語言部分)之 預處理命令
結構體 聯合 枚舉
聯合 只能保存最後賦值的結果
枚舉 所有可能值列出來
預處理命令
是在編譯前期的階段
代碼-(編譯)-->可執行文件(exe)
預編譯 編譯前對代碼處理
*1.插入頭文件的內容 #include<stdio.h>
*2.宏定義替換
3.刪除註釋--->註釋在預處理階段全部被刪除
*4.條件編譯
#----> 預處理符號
1.宏定義 #define
主要作用 定義一個宏 用於文本替換
宏 沒有類型可言
1.1無參宏定義
多用於常數的替換
可以不用一個一個的去修改常量
常用於常量 字符串 表達式 方便於檢查和修改
註意 不能重復定義
1.2帶參宏定義
帶參的宏 使用和函數類似
1.只是簡單地替換 不檢查類型 一般用它替換簡單的函數
2.直接替換 不會先計算 也不會檢查類型 (所以要註意有先級的問題)
函數的參數需要聲明類型 宏定義不需要
帶參宏定義 主要 替換簡單函數(會比函數快)
代碼比較長的函數就不適用了
2.文件包含
#include
包含函數定義
#include<stdio.h>//系統提供的 一般用<>
#include"stdio.h"//自己寫的頭文件用""
區別:
<>查找範圍在系統的文件下(如果找不到就顯示找不到)
""查找範圍-->現在當前文件下尋找,如果找到就直接使用 如果找不到就在系統文件下尋找 如果找不到就報錯
自己寫的頭文件在項目文件夾下只能用""
系統提供的頭文件 <>會查找的快一點
添加方式如下:
然後在源文件部分創建一個同名的.cpp文件 *****一定要同名*****
例如:
自己寫的頭文件
1.添加一個.h文件 和添加一個同名的.cpp文件
2..cpp文件包含頭文件
3.函數聲明放在.h裏面 定義放在.cpp中
函數聲明定義全放在.h中也可以
註意:1.如果放在.cpp裏面的函數需要調用其他函數 可以在.h裏面包含自己想要的頭文件
2.定義之後 項要使用這個函數 只需要在代碼中包含對應的頭文件即可
3.防止頭文件的相互包含
a.h b.h
a.h包含b.h 同時b.h包含a.h 文件相互包含 會導致錯誤
註意:1.一般預處理命令 後面最好不要加分號
3.條件編譯
#if //後面跟著一個條件 條件如果成立就執行後面的語句 編譯時候包含後面幾句 編譯之前可以確定的條件
#endif //結束
#elif //後面也會接條件 else if 不可以單獨使用
#else //不可以單獨使用
#ifndef //if not define 宏的作用只是判斷頭文件是否被包含
包含頭文件的時候定義一個宏 表示頭文件已經包含過了,避免頭文件的重復包含
#ifndef _INC_STDIO //若果沒有定義,那麽就定義一個宏
#define _INC_STDIO
#pragma once //防止頭文件重復包含 這個文件只會包含一次
#error
#pragma once 頭文件只包含一次
#pragma comment(LIB,"WINIMMM.LIB")
#pragma pack(n) 控制結構體對齊的
一、宏定義
1.無參宏定義
測試代碼筆記如下:
1 //無參宏定義 2 #include<stdio.h> 3 #define PI 3.1415926 //定義的一個帶參數的宏 作用:文本替換 4 #define Size 3*4+5 5 #define HELLO "hello world!" 6 #define 主函數 int main() 7 #define 退出 return 0; 8 9 主函數 10 { 11 printf("%lf\n", PI); 12 printf("%d\n", Size); 13 printf("%s\n", HELLO); 14 getchar(); 15 退出 16 }
2.帶參宏定義
測試代碼筆記如下:
1 //帶參宏定義 2 #include<stdio.h> 3 #define M(a,b)(a+b) 4 #define POW(a,b)(a*b) 5 //可選值不較少 可以直接用#define定義 6 //可選值比較多 可以用枚舉比較方便 7 int main() 8 { 9 printf("%d\n", M(3, 4)); 10 printf("%d\n", POW(3, 4));//POW(3,4)換成3*4 只是替換沒有傳參 11 printf("%d\n", POW(3+4, 4));//POW(3+4,4)--->3+4*4 先替換,再計算 12 getchar(); 13 return 0; 14 }
2019-03-28 15:13:58
C++學習(二十七)(C語言部分)之 預處理命令