c语言----预处理
c語言----預處理
- 宏
- 不帶參數的宏
- 帶參數的宏
- 頭文件
- 條件編譯
- #if 命令
- #else 與#elif
- #ifdef及#ifndef命令
- #progma命令
- 預定義宏名
宏
不帶參數的宏
宏定義指令#define 用來定義一個標識符和一個字符串,以這個標識符來代表這個字符串,在程序中每次遇到該標識符時就用所定義的字符串替換它。它的作用相當于給指定的字符串起一個別名。
不帶參數的宏的一般形式如下
#define 宏名 字符串- "#"表示這是一條預處理命令。
- 宏名是一個標識符,必須符合C語言標識符的定義。
- 字符串可以是整數,表達式,格式字符串等。
- 宏定義用于預處理命令,它不同于定義的變量,只做字符替換,不分配內存。
例如:
#define PI 3.14159它的作用是在程序中用PI替代3.14159 ,在編譯預處理時,每當在源程序中遇到PI時將自動轉換為3.14159
- 可以用 #undef命令來終止宏定義的作用域。
帶參數的宏
帶參數的宏不僅是簡單的字符替換,還可以進行參數替換。一般形式如下:
#define 宏名(參數表) 字符串 //參數表里的參數叫實參,字符串中為形參。例如:對兩個數實現乘法和加法的混合運算。
#include<stdio.h> #define MIX(a,b) ((a)*(b)+(b))void main(){ int x = 5,y = 9; printf("%d\n",MIN(x,y)) return 0; }對于帶參數的宏有以下幾點需要注意:
1.宏定義時參數要加括號,若不加括號,有時結果對有時錯。
頭文件
一般情況下將以下內容放到.h文件中:
- 宏定義。
- 結構體、聯合和枚舉聲明。
- typedef 聲明。
- 外部函數聲明。
- 全局變量聲明。
使用頭文件有以下幾點需要注意:
條件編譯
#if 命令
#if的基本含義是,如果#if命令后的參數表達式為真,則編譯#if到#endif之間的程序段,否則跳過這段程序。#endif命令用來表示#if段的結束。
一般格式如下:
#if 常數表達式語句段 # endif- 如果常數表達式為真,則這段程序會編譯,否則跳過。
例如:
#include<stdio.h> #define NUM 50 void main(){int i = 0;#if NUM>50 i++;#endif#if NUM==50i = i+50;#endifprintf("%d\n",i); return 0; }#else 與#elif
- #else:的作用是當#if為假時提供另一種選擇,作用和條件判斷中的else相似。
- #elif:用來建立一種 “如果…或者如果…”的形式。
#ifdef及#ifndef命令
在#if條件編譯命令中,需要判斷符號常量所定義的具體值,但有時并不需要判斷具體值,只需要知道這個符號常量是否被定義了,這時就需要采用另一種條件編譯的方法,即#ifdef與#ifndef命令,它們分別表示“如果有定義”和“如果無定義”。
#ifdef命令的一般形式:
#ifdef 宏替換名 語句段 #endif其意義是:如果宏替換名已經被定義過,則對“語句段”進行編譯。
#ifndef命令的一般形式:
#ifndef 宏替換名 語句段 #endif其意義是:如果宏替換名沒有被定義過,則對“語句段”進行編譯。
#progma命令
#progma命令的作用是設定編譯器的狀態,或者指示編譯器完成一些特定的動作。
一般形式如下:
#progma 參數參數可以是以下幾種情況:
- message參數:該參數能夠在編譯信息輸出窗口中輸出相應的信息。
- code_seg參數:設置程序中函數代碼存放的代碼段。
- once參數:保證頭文件被編譯一次。
預定義宏名
ANS標準說明了5個預定義宏替換名
- **_LINE_**:其含義是當前被編譯代碼的行號。
- _FILE_:其含義是當前源程序的文件名稱
- _DATE_:其含義是當前源程序的創建日期
- _TIME_:其含義是當前源程序的創建時間
- _STDC_:其含義是用來判斷當前編譯器是否為標準C,其值為1表示符合,否則不是。
總結
以上是生活随笔為你收集整理的c语言----预处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二叉树的非递归遍历(统一的模板)
- 下一篇: C语言手撸搜索(查找)二叉树---创建,