程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 經常使用C/C++預處置指令詳解

經常使用C/C++預處置指令詳解

編輯:關於C++

經常使用C/C++預處置指令詳解。本站提示廣大學習愛好者:(經常使用C/C++預處置指令詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是經常使用C/C++預處置指令詳解正文


  預處置是在編譯之前的處置,而編譯任務的義務之一就是語法檢討,預處置不做語法檢討。預處置敕令以符號“#”開首。

  經常使用的預處置指令包含:

宏界說:#define
文件包括:#include
前提編譯:#if、#elif、#ifndef、#ifdef、#endif、#undef
毛病信息指令:#error
#line指令
結構掌握:#pragma

宏界說

  宏界說又稱為宏代換、宏調換,簡稱“宏”。宏調換只作調換,不做盤算,不做表達式求解。宏界說分帶參數的宏界說和不帶參數的宏界說。在帶參數的宏界說,宏名和參數的括號間不克不及有空格。

  宏界說不分派內存,變量界說分派內存。

  宏睜開不占運轉時光,只占編譯時光;函數挪用占運轉時光(分派內存、保存現場、值傳遞、前往值)。

  湧現在宏界說中的#運算符把跟在厥後的參數轉換成一個字符串,有時把這類用法的#稱為字符串化運算符。例如:


#include<iostream>
using namespace std;

#define STR(n)"abcd"#n

int main()
{
    cout<<STR(6)<<endl;
    system("pause");
    return 0;
}

  輸入成果為:

  ##運算符用於把參數銜接到一路,預處置法式把湧現在##兩側的參數歸並成一個符號。例如:


#include<iostream>
using namespace std;
#define STR(a,b,c) a##b##c
int main()
{
    cout<<STR(1,2,3)<<endl;
    system("pause");
    return 0;
}

  輸入成果為:

文件包括

  #include<文件名>稱為尺度方法,到體系頭文件目次查找文件,#include"文件名"則先在以後目次(用戶途徑)查找,爾後到體系頭文件目次查找。

  我們以#include<iostream.h>和#include<iostream>為例解釋:iostream.h是C說話格局的頭(庫)文件,為舊版本的尺度庫,只支撐窄字符集;而iostream為C++的尺度頭文件,支撐窄字符集和寬字符集。

  被包括文件中的靜態全局變量不消在包括文件中聲明。

前提編譯

  應用前提編譯可使目的法式變小,運轉時光變短。

  #undef指令,用來刪除事前界說的宏界說,其普通情勢為:#undef宏調換名

毛病信息指令

  #error指令,該指令用於法式的調試,輸入一個毛病信息,當編譯中碰到#error指令就停滯編譯。其普通情勢為:#error失足信息。


#ifndef __cplusplus
#error this is not a C++ complier.
#endif
#include<iostream>
using namespace std;
int main()
{
    system("pause");
    return 0;
}

#line指令

  敕令#line轉變_LINE_與_FILE_的內容,它們是在編譯法式中事後界說的標識符。

  其格局為:#line number [ filename ],這條指令可以轉變以後的行號和文件名。


#include<iostream>
using namespace std;

#line 100 "a.cpp"

int main()
{
    cout<<__LINE__<<'\t'<<__FILE__<<endl;
    system("pause");
    return 0;
}

  運轉成果:

結構掌握指令

  在一切的預處置指令中,#Pragma 指令能夠是最龐雜的了,它的感化是設定編譯器的狀況或許是指導編譯器完成一些特定的舉措。#pragma指令對每一個編譯器給出了一個辦法,在堅持與C和C++說話完整兼容的情形下,給出主機或操作體系專有的特點。根據界說,編譯指導是機械或操作體系專有的,且關於每一個編譯器都是分歧的。

  其格局普通為: #pragma Para,個中Para 為參數。

message 參數:在編譯信息輸入窗口中輸入響應的信息

#pragma message("新聞文本")

code_seg參數:設置法式中函數代碼寄存的代碼段,當我們開辟驅動法式的時刻就會應用到它

#pragma code_seg(["section-name"[,"section-class"]])

#pragma once:

  只需在頭文件的最開端參加這條指令就可以夠包管頭文件被編譯一次,但移植性差。假如寫的法式要跨平台,最好應用C++中的宏界說。

#pragma hdrstop:表現預編譯頭文件到此為止,前面的頭文件不停止預編譯。

#pragma resource:

#pragma resource "winform.dfm"

表現把winform.dfm文件中的資本參加工程,winform.dfm中包含窗體外不雅的界說。

#pragma warning:輸入正告信息。

我們運轉一下法式:


int main()
{
    float f=3.6;
    int i=f;
    cout<<i<<endl;
    system("pause");
    return 0;
}

會湧現以下正告信息:

1>ClCompile:1>f.cpp1>c:\users\gaohongchen\desktop\45\5\5\f.cpp(12): warning C4305: “初始化”: 從“double”到“float”截斷1>c:\users\gaohongchen\desktop\45\5\5\f.cpp(13): warning C4244: “初始化”: 從“float”轉換到“int”,能夠喪失數據

若我們在法式上方添加:

#pragma warning(disable:4305)

則編譯時正告信息會變成:


1>ClCompile:
1>f.cpp
1>c:\users\gaohongchen\desktop\45\5\5\f.cpp(12): warning C4305: “初始化”: 從“double”到“float”截斷
1>c:\users\gaohongchen\desktop\45\5\5\f.cpp(13): warning C4244: “初始化”: 從“float”轉換到“int”,能夠喪失數據

若我們在法式上方添加:

#pragma warning(error:4244)

則正告信息會變成毛病信息:


1>ClCompile:
1>f.cpp
1>c:\users\gaohongchen\desktop\45\5\5\f.cpp(13): warning C4244: “初始化”: 從“float”轉換到“int”,能夠喪失數據

#pragma comment:該指令將一個正文記載放入一個對象文件或可履行文件中。

  經常使用的lib症結字,可以幫我們連入一個庫文件。例如:

#pragma comment(lib,"wsock32.lib")

#pragma disable:在函數前聲明,只對一個函數有用。該函數挪用進程中將弗成被中止。普通在C51中應用較多。

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