常用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中運用較多。