《c语言从入门到精通》看书笔记——第13章 预处理
生活随笔
收集整理的這篇文章主要介紹了
《c语言从入门到精通》看书笔记——第13章 预处理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、宏定義
宏定義是預處理命令的一種,它提供了一種可以替換源代碼中字符串的機制。
宏定義指令#define用來定義一個標識符和一個字符串,一這個標識符來代表這個字符串,在程序中每次遇到該標識符時就用所定義的字符串替換它。宏定義的作用相當于給指定的字符串起一個別名。
1)不帶參數的宏定義一般形式如下:
#define ? ? 宏名 ? ? 字符串
說明:
(1)#表示這是一條預處理命令。
(2)宏名是一個標識符,必須符合C語言標識符規定
(3)字符串這里可以使常數、表達式、格式字符串等。
(4)?宏定義不是c語句,不需要在行末加分號
? ? ? ? ? ? ?? (5)如果在串中含有宏名,則不進行替換。
(6)如果串長于一行,可以在該行末尾用用一反斜杠“\”續航
(7)#define命令出現在程序中函數的外面,宏名的有效范圍為定義命令之后到此源文件結束
(8)可以用#undef命令終止宏定義的作用域
(9)宏定義用于預處理命令,它不同于定義的變量,只作字符串替換,不分配內存空間。
2)帶參數的宏定義
帶參數的宏定義不是簡單的字符串替換,還要進行參數替換,其一般形式如下:
#define ? ? 宏名(參數表)字符串
? ? ? ? ? 如:#define MIX(a,b) ((a)*(b)+(b))
? ? ? ? ? 說明:
(1)宏定義時參數要加括號,如不加括號,則有時結果是正確的,有時結果是不正確的。 (2)宏擴展必須使用括號來保護表達式中低優先級的操作符,以確保調用時達到想要的結果。 2、#include 指令 在一個源文件中使用#include指令可以將另一個源文件的全部內容包含進來,也就是將另外的文件包含到本文件中。#include使編譯程序將另一源文件嵌入帶有#include的源文件,被讀入的源文件必須用雙引號或尖括號括起來。例如: #include"stdio.h" #include<stdio.h> 這兩種方式的區別: 用尖括號時,系統到存放C庫函數頭文件所在的目錄中尋找要包含的文件,這是標準方式。用雙引號時,系統先在用戶當前目錄中尋找要包含的頭文件,若找不到,再到存放頭文件所在的目錄尋找要包含的文件。通常情況下,如果要調用庫函數用#include"_”如果要包含用戶自己編寫的文件,一般用雙引號#include<_>。 ? ? ? 經常用在文件頭部的被包含的文件稱為“標題文件”或“頭部文件”,一般以.h為后綴。 ? ? ? 一般情況下將如下內容放到.h文件中: ? ? ? ? ? (1)宏定義。 ? ? ? ? ? (2)?結構、聯合和枚舉聲明。 (3)typedef聲明 (4)外部函數聲明 (5)全局變量聲明 3、條件編譯 (1)#if命令 #if的基本含義是:如果#if命令后的參數表達式為真,則編譯#if到#endif之間的程序段,否則跳過這段程序。 #if命令的一般形式為: #if 常數表達式 ? ? ? ? ? ? ? ?語句段 ? ? ? ? ? #endif #elif指令用來建立一種“如果。。。或者如果。?!边@樣階梯狀多重編譯操作選擇,這與多分支if語句中的else if類似。 #elif的一般形式如下: #if 表達式 ? ? ? ? ? ? ? ?語句段 ? ? ? ? ? #elif 表達式1 ? ? ? ? ? ? ? ?語句段 ? ? ? ? ? #elif ?表達式2 ? ? ? ? ? ? ? ?語句段 ? ? ? ? ? ?。。。 ? ? ? ? ? #elif 表達式n ? ? ? ? ? ? ? ?語句段 ? ? ? ? ? #endif (2)#ifdef及#ifndef命令 不需要判斷具體值,只需要知道這個符號常量是否被定義了,則采用#ifdef與#ifndef命令,分別表示“如果有定義”及“如果無定義”。 1)#ifdef的一般形式: #ifdef 宏替換名 ? ? ? ? ? ? ? ?語句段1 ? ? ? ? ? #else ? ? ? ? ? ? ? ?語句段2 ? ? ? ? ? #endif 其含義是:如果宏替換名已被定義過,則對“語句段”進行編譯;如果未定義#ifdef后面的宏替換名,則對“語句段2”進行編譯。 ? ? ? ? ?2)?#ifndef的一般形式: #ifndef 宏替換名 ? ? ? ? ? ? ? ?語句段1 ? ? ? ? ? #else ? ? ? ? ? ? ? ?語句段2 ? ? ? ? ? #endif 其含義是:如果未定義#ifndef后面的紅替換名,則對“語句段1”進行編譯;如果定義#ifndef后面的宏替換名,則對“語句段2”進行編譯。 (3)#undef命令 使用#undef命令可以刪除事先定義了的宏定義。 #undef命令的一般形式如下: #undef 宏替換名 #undef的主要目的是將宏名局限在僅需要他們的代碼段中 (4)#line命令 #line命令改變_LINE_與_FILE_的內容,_LINE_存放當前編譯行的行號,_FILE_存放當前編譯的文件名。 #line命令的一般形式如下: #line 行號["文件名"] 其中,行號為任一正整數,可選的文件名為任意有效文件標識符。行號為源程序中當前行號,文件名為源文件的額名字。#line命令主要用于調試及其他特殊應用。 (5)#pragma命令 #pragma命令的作用是設定編譯器的狀態,或者指示編譯器完成一些特定的動作。 #pragma命令的一般形式為: #pragma 參數 參數可以為以下幾種: 1)message參數能夠在編譯信息輸出窗口中輸出的相應信息 2)code_seg參數設置程序中函數代碼存放的代碼段 3)once參數保證頭文件被編譯一次 (6)預定義宏名 ANSI標準說明了以下5個預定義宏替換名 1)_LINE_:其含義是當前被編譯代碼的行號 2)_FINE_:其含義是當前源程序的文件名稱 3)_DATE_:其含義是當前源程序的創建日期 4)_TIME_:其含義是當前源程序的創建時間 5)_STDC_:其含義是用來判斷當前編譯器是否為標準C,若其值為1則表示符合標準C,否則不是標準C.
? ? ? ? ? 說明:
(1)宏定義時參數要加括號,如不加括號,則有時結果是正確的,有時結果是不正確的。 (2)宏擴展必須使用括號來保護表達式中低優先級的操作符,以確保調用時達到想要的結果。 2、#include 指令 在一個源文件中使用#include指令可以將另一個源文件的全部內容包含進來,也就是將另外的文件包含到本文件中。#include使編譯程序將另一源文件嵌入帶有#include的源文件,被讀入的源文件必須用雙引號或尖括號括起來。例如: #include"stdio.h" #include<stdio.h> 這兩種方式的區別: 用尖括號時,系統到存放C庫函數頭文件所在的目錄中尋找要包含的文件,這是標準方式。用雙引號時,系統先在用戶當前目錄中尋找要包含的頭文件,若找不到,再到存放頭文件所在的目錄尋找要包含的文件。通常情況下,如果要調用庫函數用#include"_”如果要包含用戶自己編寫的文件,一般用雙引號#include<_>。 ? ? ? 經常用在文件頭部的被包含的文件稱為“標題文件”或“頭部文件”,一般以.h為后綴。 ? ? ? 一般情況下將如下內容放到.h文件中: ? ? ? ? ? (1)宏定義。 ? ? ? ? ? (2)?結構、聯合和枚舉聲明。 (3)typedef聲明 (4)外部函數聲明 (5)全局變量聲明 3、條件編譯 (1)#if命令 #if的基本含義是:如果#if命令后的參數表達式為真,則編譯#if到#endif之間的程序段,否則跳過這段程序。 #if命令的一般形式為: #if 常數表達式 ? ? ? ? ? ? ? ?語句段 ? ? ? ? ? #endif #elif指令用來建立一種“如果。。。或者如果。?!边@樣階梯狀多重編譯操作選擇,這與多分支if語句中的else if類似。 #elif的一般形式如下: #if 表達式 ? ? ? ? ? ? ? ?語句段 ? ? ? ? ? #elif 表達式1 ? ? ? ? ? ? ? ?語句段 ? ? ? ? ? #elif ?表達式2 ? ? ? ? ? ? ? ?語句段 ? ? ? ? ? ?。。。 ? ? ? ? ? #elif 表達式n ? ? ? ? ? ? ? ?語句段 ? ? ? ? ? #endif (2)#ifdef及#ifndef命令 不需要判斷具體值,只需要知道這個符號常量是否被定義了,則采用#ifdef與#ifndef命令,分別表示“如果有定義”及“如果無定義”。 1)#ifdef的一般形式: #ifdef 宏替換名 ? ? ? ? ? ? ? ?語句段1 ? ? ? ? ? #else ? ? ? ? ? ? ? ?語句段2 ? ? ? ? ? #endif 其含義是:如果宏替換名已被定義過,則對“語句段”進行編譯;如果未定義#ifdef后面的宏替換名,則對“語句段2”進行編譯。 ? ? ? ? ?2)?#ifndef的一般形式: #ifndef 宏替換名 ? ? ? ? ? ? ? ?語句段1 ? ? ? ? ? #else ? ? ? ? ? ? ? ?語句段2 ? ? ? ? ? #endif 其含義是:如果未定義#ifndef后面的紅替換名,則對“語句段1”進行編譯;如果定義#ifndef后面的宏替換名,則對“語句段2”進行編譯。 (3)#undef命令 使用#undef命令可以刪除事先定義了的宏定義。 #undef命令的一般形式如下: #undef 宏替換名 #undef的主要目的是將宏名局限在僅需要他們的代碼段中 (4)#line命令 #line命令改變_LINE_與_FILE_的內容,_LINE_存放當前編譯行的行號,_FILE_存放當前編譯的文件名。 #line命令的一般形式如下: #line 行號["文件名"] 其中,行號為任一正整數,可選的文件名為任意有效文件標識符。行號為源程序中當前行號,文件名為源文件的額名字。#line命令主要用于調試及其他特殊應用。 (5)#pragma命令 #pragma命令的作用是設定編譯器的狀態,或者指示編譯器完成一些特定的動作。 #pragma命令的一般形式為: #pragma 參數 參數可以為以下幾種: 1)message參數能夠在編譯信息輸出窗口中輸出的相應信息 2)code_seg參數設置程序中函數代碼存放的代碼段 3)once參數保證頭文件被編譯一次 (6)預定義宏名 ANSI標準說明了以下5個預定義宏替換名 1)_LINE_:其含義是當前被編譯代碼的行號 2)_FINE_:其含義是當前源程序的文件名稱 3)_DATE_:其含義是當前源程序的創建日期 4)_TIME_:其含義是當前源程序的創建時間 5)_STDC_:其含義是用來判斷當前編譯器是否為標準C,若其值為1則表示符合標準C,否則不是標準C.
總結
以上是生活随笔為你收集整理的《c语言从入门到精通》看书笔记——第13章 预处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 远近旋转球体
- 下一篇: LintCode: Search A 2