• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 關于include的一些簡單介紹

    發表于:2007-05-26來源:作者:點擊數: 標簽:
    關于include的一些簡單介紹 有些新手會對編譯器的一些預處理機制不是很明白,所以寫點相關的東西。內容主要來源:《c prmer plus》及 《c++ primer》 在程序編譯之前,首先由預處理器檢查程序。在 GCC 工具鏈中,gcc 和 g++ 分別是C/C++ 編譯程序,而預處理程
    關于include的一些簡單介紹

    有些新手會對編譯器的一些預處理機制不是很明白,所以寫點相關的東西。內容主要來源:《c prmer plus》及 《c++ primer》

    在程序編譯之前,首先由預處理器檢查程序。在 GCC 工具鏈中,gcc 和 g++ 分別是C/C++ 編譯程序,而預處理程序叫 cpp,是獨立的。根據程序中使用的預處理器指令,預處理器使用符號縮略語所代表的內容替換程序中的縮略語。預處理指令以 # 為行首,一條指令占據一行。預處理器不能理解c/c++,它一般可以接收任何文本并按照替換規則將其轉換成其他文本。

    頭文件通過 include 預處理器指示符(preprocessor include directive) 而成為我們程序的一部分。預處理器發現 #include 指令后,就會尋找后跟的文件名并把這個文件的內容包含到當前文件中。被包含文件中的文本將替換源代碼文件中的#include 指令, 就像你把被包含文件中的全部內容鍵入到源文件中的這個位置一樣。
    #include 指令有兩種使用形式
    #include <stdio.h> 文件名放在尖括號中
    #include “mystuff.h” 文件名放在雙引號中

    尖括號< 和> 括起來表明這個文件是一個工程或標準頭文件。查找過程會檢查預定義的目錄,我們可以通過設置搜索路徑環境變量或命令行選項來修改這些目錄。在 gcc 中可以使用 -I 參數修改默認查找路徑。
    如果文件名用一對引號括起來則表明該文件是用戶提供的頭文件,查找該
    文件時將從當前文件目錄(或文件名指定的其他目錄)中尋找文件,然后再在標準位置尋找文件。
    因為計算機系統的結構不完全相同, 所以ANSI C不要求對文件采用一樣的目錄模式。一般而言,命名文件的方法依賴于系統,但是尖括號和雙引號的使用則與系統無關。
    為什么要包含文件呢?
    因為這些文件包含了編譯器所需的信息,如函數的聲明、常量的定義等。例如, 標準庫頭文件stdio.h文件通常包含EOF,NULL,getchar()和putchar()的定義。
    包含大型頭文件并不一定顯著增加程序的大小。很多情況下,頭文件中的內容是編譯器產生最終代碼所需的信息,而不是加到最終代碼里的具體語句。

    被包含的文件還可以含有#include 指示符由于嵌套包含文件的原因一個頭文件可能會被多次包含在一個源文件中條件指示符可防止這種頭文件的重復處理。
    例如:
    #ifndef BOOKSTORE_H
    #define BOOKSTORE_H

    /* Bookstore.h 的內容 */

    #endif
    條件指示符#ifndef 檢查BOOKSTORE_H 在前面是否已經被定義,這里BOOKSTORE_H是一個預編譯器常量習慣上預編譯器常量往往被寫成大寫字母,如BOOKSTORE_H在前面沒有被定義則條件指示符的值為真于是從#ifndef 到#endif 之間的所有語句都被包含進來進行處理。相反,如果#ifndef 指示符的值為假則它與#endif 指示符之間的行將被忽略,為了保證頭文件只被處理一次,把如下#define 指示符
    #define BOOKSTORE_H
    放在#ifndef 后面這樣在頭文件的內容第一次被處理時BOOKSTORE_H 將被定義
    從而防止了在程序文本文件中以后#ifndef 指示符的值為真。
    只要不存在兩個必須包含的頭文件要檢查一個同名的預處理器常量這樣的情形這
    個策略就能夠很好地運作。#ifdef 指示符常被用來判斷一個預處理器常量是否已被定義以便有條件地包含程序代碼。
    #ifdef 除了用于防止重復包含,還可以用于針對不同環境的條件編譯。經常出現的有
    #if defined (__GCC__)  &brvbar; ¦ defined (__SUN_C__)  
    之類的指令,就是針對不同編譯器、平臺進行選擇編譯的預處理指令。當編譯環境沒有定義這個特定的符號的時候,則預處理器會自動忽略這一部分的代碼。除了用 #ifdef 判斷符號是否定義,還可以判斷符號的值。VC 中常見的將 MSC_VER 與特定值比較以判斷 VC 的版本的做法就是這個道理。
    除了以上提到的一些內容,還有一些相對少見的預處理器指令,如 #pragma。它們分別提供了一些特殊的優化手段和編譯器控制方法,可以顯著提高代碼質量減輕編碼負擔,但是很多時候使用這些編譯指令可能是不兼容于其他編譯環境的,因此在項目中選用非標準預處理指令的時候,應該在可移植性和編碼的優勢中進行衡量后作決定。

    原文轉自:http://www.kjueaiud.com

    評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>