預處理功能主要包括宏定義,文件包含,條件編譯三部分。分別對應宏定義命令,文件包含命令,條件編譯命令三部分實現。
預處理過程讀入源代碼,檢查包含預處理指令的語句和宏定義,並對源代碼進行響應的轉換。預處理過程還會刪除程序中的注釋和多余的空白字符。
預處理指令是以#號開頭的代碼行。#號必須是該行除了任何空白字符外的第一個字符。#后是指令關鍵字,在關鍵字和#號之間允許存在任意個數的空白字符。整行語句構成了一條預處理指令,該指令將在編譯器進行編譯之前對源代碼做某些轉換。
指令 用途
# 空指令,無任何效果
#include 包含一個源代碼文件
#define 定義宏
#undef 取消已定義的宏
#if 如果給定條件為真,則編譯下面代碼
#ifdef 如果宏已經定義,則編譯下面代碼
#ifndef 如果宏沒有定義,則編譯下面代碼
#elif 如果前面的#if給定條件不為真,當前條件為真,則編譯下面代碼
#endif 結束一個#if……#else條件編譯塊
#error 停止編譯並顯示錯誤信息
#else 略
#error 指令將使編譯器顯示一條錯誤信息,然后停止編譯。
#line 指令可以改變編譯器用來指出警告和錯誤信息的文件號和行號。
#pragma 指令沒有正式的定義。編譯器可以自定義其用途。典型的用法是禁止或允許某些煩人的警告信息。
在程序中包含頭文件有兩種格式:
#include <my.h>
#include "my.h"
#include <my.h>
#include "my.h"
l第一種方法是用尖括號把頭文件括起來。這種格式告訴預處理程序在編譯器自帶的或外部庫的頭文件中搜索被包含的頭文件。第二種方法是用雙引號把頭文件括起來。這種格式告訴預處理程序在當前被編譯的應用程序的源代碼文件中搜索被包含的頭文件,如果找不到,再搜索編譯器自帶的頭文件。
采用兩種不同包含格式的理由在於,編譯器是安裝在公共子目錄下的,而被編譯的應用程序是在它們自己的私有子目錄下的。一個應用程序既包含編譯器提供的公共頭文件,也包含自定義的私有頭文件。采用兩種不同的包含格式使得編譯器能夠在很多頭文件中區別出一組公共的頭文件。
采用兩種不同包含格式的理由在於,編譯器是安裝在公共子目錄下的,而被編譯的應用程序是在它們自己的私有子目錄下的。一個應用程序既包含編譯器提供的公共頭文件,也包含自定義的私有頭文件。采用兩種不同的包含格式使得編譯器能夠在很多頭文件中區別出一組公共的頭文件。
貼上有用的代碼:
#include<stdio.h> #include<stdlib.h> #include<string.h> #define SIX 6 #define SEVEN 7 #define Cube(x) (x)*(x)*(x) #define VERSION "tzs" #define PASTE(n) "最終勝利者是:"#n #define NUM(a,b,c) a##b##c #define STR(a,b,c) a##b##c #define DEBUG 1 int main() { int i; i = SIX + SEVEN; printf("i = %d\n",i); i = (SIX * SEVEN); printf("i = %d\n",i); i = Cube(3); printf("i = %d\n",i); printf("%s",VERSION); printf("%s",PASTE(桃子)); puts(PASTE(yy/)); puts(PASTE(xx)); printf("%d\n",NUM(1,2,3)); //printf("%s\n",STR("aa","bb","cc")); #if DEBUG printf("Debugging\n"); printf("Debugging2222\n"); #endif printf("Running\n"); #if defined DEBUG printf("yes\n"); #endif #if !defined JJ printf("no JJ\n"); #endif }