程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 解析C++編程中的#include和前提編譯

解析C++編程中的#include和前提編譯

編輯:關於C++

解析C++編程中的#include和前提編譯。本站提示廣大學習愛好者:(解析C++編程中的#include和前提編譯)文章只能為提供參考,不一定能成為您想要的結果。以下是解析C++編程中的#include和前提編譯正文


文件包括的感化

所謂“文件包括”處置是指一個源文件可以將別的一個源文件的全體內容包括出去,行將別的的文件包括到本文件當中。C++供給了#include敕令用來完成“文件包括”的操作。如在file1.cpp中有以下#include敕令:

  #include ″file2.cpp″

它的感化見圖表示。


“文件包括”敕令是很有效的,它可以節儉法式設計人員的反復休息。

#include敕令的運用很普遍,絕年夜多半C++法式中都包含#include敕令。如今,庫函數的開辟者把這些信息寫在一個文件中,用戶只需將該文件“包括”出去便可(如挪用數學函數的,應包括cmath文件—),這就年夜年夜簡化了法式,寫一行#include敕令的感化相當於寫幾十行、幾百行乃至更多行的內容。這類經常使用在文件頭部的被包括的文件稱為“題目文件”或“頭部文件”。

頭文件普通包括以下幾類內容:

  • 對類型的聲明。
  • 函數聲明。
  • 內置(inline)函數的界說。
  • 宏界說。用#define界說的符號常量和用const聲明的常變量。
  • 全局變量界說。
  • 內部變量聲明。如entern int a;
  • 還可以依據須要包括其他頭文件。

分歧的頭文件包含以上分歧的信息,供給給法式設計者應用,如許,法式設計者不需本身反復書寫這些信息,只需用一行#include敕令就把這些信息包括到本文件了,年夜年夜地進步了編程效力。因為有了#include敕令,就把分歧的文件組合在一路,構成一個文件。是以說,頭文件是源文件之間的接口。
include敕令的兩種情勢

在#include敕令中,文件名除可以用尖括號括起來之外,還可以用雙撇號括起來。#include敕令的普通情勢為:
    #include <文件名>

    #include ″文件名″
如:
    #include <iostream>

    #include ″iostream″
都是正當的。兩者的差別是: 用尖括號時,體系到體系目次中尋覓要包括的文件,假如找不到,編譯體系就給出失足信息。

有時被包括的文件紛歧定在體系目次中,這時候應當用雙撇號情勢,在雙撇號中指出文件途徑和文件名。

假如在雙撇號中沒有給出相對途徑,如#include ″file2.c″則默許指用戶以後目次中的文件。體系先在用戶以後目次中尋覓要包括的文件,若找不到,再按尺度方法查找。假如法式中要包括的是用戶本身編寫的文件,宜用雙撇號情勢。

關於體系供給的頭文件,既可以用尖括號情勢,也能夠用雙撇號情勢,都能找到被包括的文件,但明顯用尖括號情勢更直接了當,效力更高。
關於C++尺度庫

在C++編譯體系中,供給了很多體系函數和宏界說,而對函數的聲明則分離寄存在分歧的頭文件中。假如要挪用某一個函數,就必需用#include敕令將有關的頭文件包括出去。C++的庫除保存C的年夜部門體系函數和宏界說外,還增長了預界說的模板和類。然則分歧C++庫的內容不完整雷同,由各C++編譯體系自行決議。不久前推出的C++尺度將庫的扶植也歸入尺度,標准化了C++尺度庫,以便使C++法式可以或許在分歧的C++平台上任務,便於相互移植。新的C++尺度庫中的頭文件普通不再包含後綴.h,例如:

  #include <string>

但為了使年夜批已有的C法式能持續應用,很多C++編譯體系保存了C的頭文件,即供給兩種分歧的頭文件,由法式設計者選用。如:

  #include <iostream.h> //C情勢的頭文件
  #include <iostream> //C++情勢的頭文件


後果根本上是一樣的。建議盡可能用相符C++尺度的情勢,即在包括C++頭文件時普通不消後綴。假如用戶本身編寫頭文件,可以用.h為後綴。

C++前提編譯#ifdef #else
普通情形下,在停止編譯時對源法式中的每行都要編譯。然則有時願望法式中某一部門內容只在知足必定前提時才停止編譯,也就是指定對法式中的一部門內容停止編譯的前提。假如不知足這個前提,就不編譯這部門內容。這就是“前提編譯”。

有時,願望當知足某前提時對一組語句停止編譯,而當前提不知足時則編譯另外一組語句。

前提編譯敕令經常使用的有以下情勢:
1) #ifdef 標識符
    法式段1
#else
    法式段2
#endif

它的感化是當所指定的標識符曾經被#define敕令界說過,則在法式編譯階段只編譯法式段1,不然編譯法式段2。#endif用來限制#ifdef敕令的規模。個中#else部門也能夠沒有。

2) #if 表達式
    法式段1
#else
    法式段2
#endif

它的感化是當指定的表達式值為真(非零)時就編譯法式段1,不然編譯法式段2。可以事前給定必定前提,使法式在分歧的前提下履行分歧的功效。

【例】在調試法式時,經常願望輸入一些所需的信息,而在調試完成後不再輸入這些信息,可以在源法式中拔出前提編譯段。上面是一個簡略的示例。

#include <iostream>
using namespace std;
#define RUN //在調試法式時使之成為正文行
int main( )
{
  int x=1, y=2, z=3;
  #ifndef RUN //本行動前提編譯敕令
  cout<<"x="<<x<<", y="<<y<<", z="<<z<<"\n"; //在調試法式時須要輸入這些信息
  #endif //本行動前提編譯敕令
  cout<<"x*y*z="<<x*y*z<<endl;
}

第3行用#define敕令的目標不在於用RUN代表一個字符串,而只是表現已界說過RUN,是以RUN前面寫甚麼字符串都無所謂,乃至可以不寫字符串。在調試法式時去失落第3行(或外行首加//,使之成為正文行),因為無此行,故未對RUN界說,第6行據此決議編譯第7行,運轉時輸入x,y,z的值,以便用戶剖析有關變量以後的值。運轉法式輸入:

  x=1, y=2, z=3
  x*y*z=6


在調試完成後,在運轉之前,加上第3行,從新編譯,因為此時RUN已被界說過,則該cout語句不被編譯,是以在運轉時不再輸入x,y,z的值。運轉情形為:

x*y*z=6

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved