日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C/C++預處理淺析使用形式_C 語言

作者:AKA.瞳源治 ? 更新時間: 2022-11-03 編程語言

文件包含

文件包含命令行的一般形式為:

#include"文件名" 或 #include<文件名>

值得注意的是,

(1)<>表示在包含文件目錄中去查找(包含目錄是由用戶在設置環境時設置的include目錄),而不在當前源文件目錄去查找;

(2) ""則表示首先在當前源文件目錄中查找,若未找到才到包含目錄中去查找。

(3)一個include命令只能指定一個被包含文件,若有多個文件要包含,則需用多個include命令。

(4)一個包含文件中可以包含別的包含文件。

宏定義

C語言程序中廣泛的使用宏定義,采用關鍵字define進行定義,宏只是一種簡單的字符串替換,根據是否帶參數分為無參和帶參。

無參數的宏

#define 宏名 一段符號

其中一段符號表示你需要的用宏名來代替的一段符號,在編譯預處理時,程序中出現的所有你設定的宏名都將被這段符號代替。

樣例:#defineip114514

表示程序中出現的所有ip都將表示114514。

測試:

#include <stdio.h>
#define	ip  114514
int main()
{
	int a = ip;
    printf("%d\n",a);
    return 0;
}

結果:

一般我們使用宏定義是為了方便修改和管理代碼。

需要注意的是宏定義不作語法檢查,只有在編譯被宏展開后的源程序才會報錯。

測試1:

#include <stdio.h>
#define	ip  1+2 = 3
int main()
{
    int a = 0;
    printf("%d\n", a);
    return 0;
}

結果:

這里沒使用宏,宏沒被展開,宏沒做語法檢查而不報錯。

測試2:

#include <stdio.h>
#define	ip  1+2 = 3
int main()
{
    int a = ip;
    printf("%d\n", a);
    return 0;
}

結果:

宏被展開了,直接編譯報錯。

帶參宏定義

#define 宏名(形參表) 字符串

在宏定義中的參數稱為形式參數,在宏調用中的參數稱為實際參數。

對帶參數的宏,在調用中,不僅要宏展開,而且要用實參去代換形參。

樣例:#define MULTIPLY_2(x,y) ((x)*(y))

注意:在這個宏中,x和y作為參數在表達式中,應被括號分隔開。也就是說當宏中有表達式時,其內部參數需被括號獨立,防止程序出錯。

樣例:

#include <stdio.h>
#define	a1(x,y) (x*y)
#define	a2(x,y) ((x)*(y))
int main()
{
    int a = 1;
    int b = 2;
    int sum1 = a1(a + b, b);//sum1=(a+b*b)
    int sum2 = a2(a + b, b);//sum2=((a+b)*b)
    printf("%d %d\n", sum1,sum2);
    return 0;
}

結果:

條件編譯

一般情況下,源程序中所有的行都參加編譯。但有時希望對其中一部分內容只在滿足一定條件才進行編譯,也就是對一部分內容指定編譯的條件,這就是條件編譯。

樣例1:

#include <stdio.h>
#define	a1(x,y) (x*y)
#define	a2(x,y) ((x)*(y))
int main()
{
    int a = 1;
    int b = 2;
    int sum1 = a1(a + b, b);
	int sum2 = 0;
#ifdef a2   //這里只是檢查宏有沒有定義,并不檢查值
	if (a == 1)
	{
		sum2 = a2(a + b, b);
	}
#else
	if (a == 2)
	{
		int sum2 = a2(a + b, b);
	}
#endif
	{
		printf("%d %d\n", sum1,sum2);
	}
    return 0;
}

結果:

樣例2:

#include <stdio.h>
#define	a1(x,y) (x*y)
//#define	a2(x,y) ((x)*(y))
int main()
{
    int a = 1;
    int b = 2;
    int sum1 = a1(a + b, b);
	int sum2 = 0;
#ifdef a2   //這里只是檢查宏有沒有定義,并不檢查值
	if (a == 1)
	{
		sum2 = a2(a + b, b);
	}
#else
	sum2 = sum1;
#endif
	{
		printf("%d %d\n", sum1,sum2);
	}
    return 0;
}

結果:

顯而易見的,宏有沒有定義直接影響了程序運行的結果。

ps:c編譯器中,有幾個特殊形式的預定義宏需要我們注意。

__FILE__ 宏所在文件的源文件名

__FUNCTION__宏所在函數名

__LINE__宏所在行的行號

__DATE__ 代碼編譯的日期

__TIME__ 代碼編譯的時間

樣例:

#include <stdio.h>
#define	a1(x,y) (x*y)
//#define	a2(x,y) ((x)*(y))
int main()
{
    int a = 1;
    int b = 2;
    int sum1 = a1(a + b, b);
	int sum2 = 0;
#ifdef a2   //這里只是檢查宏有沒有定義,并不檢查值
	if (a == 1)
	{
		sum2 = a2(a + b, b);
	}
#else
	sum2 = sum1;
#endif
	{
		printf("%d %d\n", sum1,sum2);
	}
	printf("文件名:%s\n", __FILE__);
	printf("函數名:%s\n", __FUNCTION__);
	printf("行  號:%d\n", __LINE__);  // 
	printf("日  期:%s\n", __DATE__);  // 
	printf("時  間:%s\n", __TIME__);  // 
	return 0;
}

結果:

原文鏈接:https://blog.csdn.net/qq_64109690/article/details/126672310

欄目分類
最近更新