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;
}