C++預定義指令
- 2022 年 11 月 12 日
- 筆記
C++預定義指令
1.預定義器
以#開頭的命令,稱之為預定義器指令。預定義器指令不在編譯器中執行,而是在預定義器中運行。
常見的預定義器指令為
//文件包含指令
#include
//宏定義指令
#define
#undef
//條件編譯指令
#ifdef
#endif
#ifndef
#endif
#if
#else
2.預定義表示宏
__cplusplus:當翻譯單元編譯為 C++ 時,定義為整數文本值。 其他情況下則不定義。
__ DATE __:當前源文件的編譯日期。
__ FILE __:當前源文件的名稱。
__ LINE __:定義為當前源文件中的整數行號。
__ func __ 作為函數本地靜態 const 數組的封閉函數的未限定和未限定名稱 char。
void example()
{
printf("%s\n", __func__);
}
cout << "This is the line number " << __LINE__;
cout << " of file " << __FILE__ << ".\n";
cout << "Its compilation began " << __DATE__;
cout << " at " << __TIME__ << ".\n";
cout << "The compiler gives a __cplusplus value of " << __cplusplus;
example();
3.宏定義使用
宏定義語法:
#define identifier replacement // 宏定義
#undef identifier // 取消宏定義
詳細使用:
#define Math 10//值形態
#define PI 100
#define GetSum(a,b) (a)+(b)//函數宏,函數宏中的變數最好用()包裹,以免發生報錯
4.條件編譯
#ifdef PI//條件編譯,只有在PI宏已經定義後才可以進行編譯
std::cout << PI << std::endl;
#endif
#ifndef PT
std::cout<<"在PT宏沒有被定義的時候列印該行數據"<<endl;
#endif
//#if #else ,和if,else語句類似
5.報錯預定義符
#error
//該預定義符,一般用於編譯調試的時候,編譯器在執行到這裡的時候,自動報錯,中斷程式
6.line處理
#line 10 "文件名"
//將下面的程式碼,行數和文件名設置為line設置的行數和文件名
//如果不設定的話,行數和文件名自動設置為改行所在的行數和文件名
7.程式碼案列
//預處理指令和宏
#include <iostream>
#include<stdio.h>
//宏定義
#define Math 10//值形態
#define PI 100
//取消宏定義,取消宏定義放到main()之前,則會報錯.需要放在mian函數之中
//#undef Math
#define GetSum(a,b) (a)+(b)//函數宏
using namespace std;
void example()
{
printf("%s\n", __func__);
}
int main(int argc, char *argv[])
{
#undef Math//取消宏定義
int a=10;
int b=10;
int c=GetSum(a,b);//調用函數宏
cout<<"c="<<c<<endl;
#ifdef PI//條件編譯,只有在PI宏已經定義後才可以進行編譯
std::cout << PI << std::endl;
#endif
#ifndef PT
std::cout<<"在PT宏沒有被定義的時候列印該行數據"<<endl;
#endif
//#if #else ,和if,else語句類似
//預定義宏
/*
預定義宏僅針對特定生成環境或編譯器選項定義。 除非另行說明,否則這些宏的定義範圍適用於整個翻譯單元。
定義後,預處理器先將這些宏展開為指定的值,然後再編譯。 預定義宏不帶參數,不能重新定義。
*/
cout << "This is the line number " << __LINE__;
cout << " of file " << __FILE__ << ".\n";
cout << "Its compilation began " << __DATE__;
cout << " at " << __TIME__ << ".\n";
cout << "The compiler gives a __cplusplus value of " << __cplusplus<<endl;
//#line處理
cout<<"該行程式碼所在的行數為"<<__LINE__<<"文件所在的位置為"<<__FILE__<<endl;
#line 50 "main.cpp" //#line指令允許我們控制這兩件事,程式碼文件中的行號以及發生錯誤時我們希望顯示的文件名。它的格式是
cout<<"該行程式碼所在的行數為"<<__LINE__<<"文件所在的位置為"<<__FILE__<<endl;
//#error用於報錯,在調試程式的時候用得上
//預定義表示符
example();
/*
__cplusplus:當翻譯單元編譯為 C++ 時,定義為整數文本值。 其他情況下則不定義。
__ DATE __:當前源文件的編譯日期。
__ FILE __:當前源文件的名稱。
__ LINE __:定義為當前源文件中的整數行號。
*/
cout << "This is the line number " << __LINE__;
cout << " of file " << __FILE__ << ".\n";
cout << "Its compilation began " << __DATE__;
cout << " at " << __TIME__ << ".\n";
cout << "The compiler gives a __cplusplus value of " << __cplusplus;
return 0;
}