歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C++預處理

一、預處理的由來:
    在C++的歷史發展中,有很多的語言特征(特別是語言的晦澀之處)來自於C語言,預處理就是其中的一個。C++從C語言那裡把C語言預處理器繼承過來(C語言預處理器,被Bjarne博士簡稱為Cpp,不知道是不是C Program Preprocessor的簡稱)。 

二、常見的預處理功能:
    預處理器的主要作用就是把通過預處理的內建功能對一個資源進行等價替換,最常見的預處理有:文件包含,條件編譯、布局控制和宏替換4種。
        文件包含:#include 是一種最為常見的預處理,主要是做為文件的引用組合源程序正文。

        條件編譯:#if,#ifndef,#ifdef,#endif,#undef等也是比較常見的預處理,主要是進行編譯時進行有選擇的挑選,注釋掉一些指定的代碼,以達到版本控制、防止對文件重復包含的功能。

        布局控制:#progma,這也是我們應用預處理的一個重要方面,主要功能是為編譯程序提供非常規的控制流信息。

        宏替換:#define,這是最常見的用法,它可以定義符號常量、函數功能、重新命名、字符串的拼接等各種功能。   

三、預處理指令:
  預處理指令的格式如下:
    # directive tokens
    #符號應該是這一行的第一個非空字符,一般我們把它放在起始位置。如果指令一行放不下,可以通過/進行控制,例如:
    #define Error   if(error) exit(1)    等價於
    #define Error /
            if(error) exit(1)
    不過我們為了美化起見,一般都不怎麼這麼用,更常見的方式如下:
    # ifdef __BORLANDC__
            if_true<(is_convertible<Value,named_template_param_base>::value)>::
            template then<make_named_arg, make_key_value>::type Make;
    # else
            enum { is_named = is_named_parameter<Value>::value };
            typedef typename if_true<(is_named)>::template
            then<make_named_arg, make_key_value>::type Make;
    # endif
    下面我們看一下常見的預處理指令:
    #define          宏定義
    #undef           未定義宏
    #include         文本包含
    #ifdef           如果宏被定義就進行編譯
    #ifndef          如果宏未被定義就進行編譯
    #endif           結束編譯塊的控制
    #if              表達式非零就對代碼進行編譯
    #else            作為其他預處理的剩余選項進行編譯
    #elif            這是一種#else和#if的組合選項
    #line            改變當前的行數和文件名稱
    #error           輸出一個錯誤信息
    #pragma          為編譯程序提供非常規的控制流信息
    下面我們對這些預處理進行說明,考慮到宏的重要性和繁瑣性,我們把它放到最後講。

 

四、文件包含指令:
    這種預處理使用方式是最為常見的,平時我們編寫程序都會用到,最常見的用法是:
    #include <iostream>              file://標准庫頭文件
    #include <iostream.h>             file://舊式的標准庫頭文件
    #include "IO.h"                  file://用戶自定義的頭文件
    #include "../file.h"                file://UNIX下的父目錄下的頭文件
    #include "/usr/local/file.h"          file://UNIX下的完整路徑
    #include "../file.h"                file://Dos下的父目錄下的頭文件
    #include "/usr/local/file.h"          file://Dos下的完整路徑
    這裡面有2個地方要注意:
    1、我們用<iostream>還是<iostream.h>?
       我們主張使用<iostream>,而不是<iostream.h>,為什麼呢?幾點理由:
       首先,.h格式的頭文件早在98年9月份就被標准委員會拋棄了,我們應該緊跟標准,以適合時代的發展。
       其次,iostream.h只支持窄字符集,iostream則支持窄/寬字符集。
       還有,標准對iostream作了很多的改動,接口和實現都有了變化。
       最後,iostream組件全部放入namespace std中,防止了名字污染。
    2、<io.h>和"io.h"的區別? 其實他們唯一的區別就是搜索路徑不同:
       對於#include  <io.h> ,編譯器從標准庫路徑開始搜索
       對於#include  "io.h" ,編譯器從用戶的工作路徑開始搜索

 

五、編譯控制指令:
    這些指令的主要目的是進行編譯時進行有選擇的挑選,注釋掉一些指定的代碼,以達到版本控制、防止對文件重復包含的功能。
    使用格式,如下:
    1、#ifdef  identifier
              your code
       #endif      如果identifier為一個定義了的符號,your code就會被編譯,否則剔除
    2、#ifndef identifier
              your code
       #endif      如果identifier為一個未定義的符號,your code就會被編譯,否則剔除
    3、#if  expression
           your code
       #endif      如果expression非零,your code就會被編譯,否則剔除
    4、#ifdef identifier
             your code1
       #else
             your code2
       #endif      如果identifier為一個定義了的符號,your code1就會被編譯,否則your code2就會被編譯
    5、#if   expressin1
            your code1
       #elif expression2
            your code2
       #else
            your code3
       #enif     如果epression1非零,就編譯your code1,否則,如果expression2非零,就編譯your code2,否則,就編譯your code3

Copyright © Linux教程網 All Rights Reserved