標頭檔案包含
條件編譯
作用:文字替換 提高**的可讀性
//示例 1
#define pi 3.1415926
帶參巨集沒有引數型別 也沒有返回值型別可以接受任意型別的引數 本質是替換
沒有任何檢查
//示例 2
#define add(a,b) a+b
在示例 2 中需要考慮優先順序問題
#include
#define add(a,b) a+b
intmain()
帶參巨集定義的時候加()
//示例 3
#define add(a,b) (a)+(b)
在某些特定的情況下加()也會出錯
//示例 4
//c++面試題:#define min(a,b) ( (a) <= (b) ? (a) : (b) )
#include
#define min(a,b) ((a)<=(b)?(a):(b))
intmain()
解釋一下:
min
(*p++
,b)=((
*p++
)<
(b))?(
*p++):
(b)這個表示式會產生***,指標p會作二次++自增操作
開始p指向a,後來就不知道指向的是那個位址
需要注意的幾點:
特殊的巨集
編譯器內建的巨集定義
__line__
// 在源**中插入當前源**行號
__file__
// 在原始檔中插入當前源檔名
__date__
// 在原始檔中插入當前的編譯日期
__time__
// 在原始檔中插入當前編譯時間
這些巨集定義不僅可以幫助我們完成跨平台的原始碼編寫,靈活使用也可以巧妙地幫我們輸出非常有用的除錯資訊
//示例5
#include
intmain()
輸出結果:
__file__
:d:\test\test.c
__date__
:dec 22
2019
__time__:00
:37:15
__line__:7
press any key to continue
使用庫函式之前,應該用區別:#include
引入對應的標頭檔案。這種以#
號開頭的命令稱為預處理命令。#include<>
#include" "
先去系統目錄中去找標頭檔案 找不到 報錯
先去專案資料夾找標頭檔案 找不到 在去系統目錄找 都找不到 報錯
使用注意:
系統標頭檔案stdio.h用<>更快
自己編寫的標頭檔案用" "
條件編譯指令
說 明#if
如果條件為真,則執行相應操作
#elif
如果前面條件為假,而該條件為真,則執行相應操作
#else
如果前面條件均為假,則執行相應操作
#endif
結束相應的條件編譯指令
#ifdef
如果該巨集已定義,則執行相應操作
#ifndef
如果該巨集沒有定義,則執行相應操作
#if-#elif-#else-#endif
#if 條件表示式1寫注釋的時候可以這樣注釋,當條件為0時**段不編譯程式段 1
#elif 條件表示式2
程式段 2
#else
程式段3
#endif
#if 0
//**段
#endif
#ifndef - #define - #endif#ifndef 識別符號多檔案程式設計#define 識別符號
//…#endif
作用:防止標頭檔案重複包含
檔案
#pragma once
//這個標頭檔案只包含一次
#ifndef _test_h_
//防止標頭檔案重複包含
#define _test_h_
//型別定義 函式宣告 巨集定義 ....
#include
#define n 10
struct student //結構體定義
;void
fun();
//函式宣告
#endif
同名.c檔案
#include
"test.h"
//包含同名.h
//函式定義.... 放同名.c檔案當中
void
fun(
)
#pragma
在多檔案程式設計,.**件開頭加上這段**防止標頭檔案重複包含
#pragma once
用n個位元組作為對齊單位 n是2的x次方 1 2 4 8 16
//示例 6
#include
typedef
struct test
test;
intmain()
根據對齊規則,輸出結果為:size:16
//示例 7
#include
#pragma pack(4)
//設定結構體對齊單位為4
typedef
struct test
test;
intmain()
由於設定了對齊單位,所以輸出結果為:size:12 C語言基礎(十) 預處理
預處理就是在編譯之前所做的事情,所以也叫預編譯,主要有巨集定義 檔案包含處理和條件編譯。巨集定義指令是指用乙個指定的識別符號代表乙個字串,可以減少程式中重複書寫某些字串的工作量,使用巨集可以達到 一改全改 的 規範。巨集定義主要分為不帶引數的巨集定義 和 帶引數的巨集定義。不帶引數的巨集定義 def...
C語言基礎 預處理
預處理 1.c語言在對源程式進行編譯之前,會先對一些特殊的預處理指令作解釋 比如之前使用的 include檔案包含指令 產生乙個新的源程式 這個過程稱為編譯預處理 之後再進行通常的編譯 2.為了區分預處理指令和一般的c語句,所有預處理指令都以符號 開頭,並且結尾不用分號 3.預處理指令可以出現在程式...
C語言基礎 預處理
預處理 預處理命令是由ansi c統一規定的,但是它們不是c語言本身的組成部分,不能直接對它們進行編譯 因為編譯程式不能識別它們 必須在對程式進行通常的編譯 包括詞法和語法分析 生成 優化等 之前,先對程式中這些特殊的命令進行 預處理 即根據預處理命令對程式作相應的處理 例如,若程式中用 defin...