預處理

無參宏定義

無參宏的宏名後不帶參數。css

#define 標識符 字符串函數

define爲宏定義命令。「標識符」爲所定義的宏名(通常用大寫字母)。「字符串」能夠是常數、表達式、字符串等。spa

 

宏定義必須寫在函數以外,其做用域爲宏定義命令起到源程序結束。如要終止其做用域可以使用#undef命令code

宏名在源程序中若用引號括起來,則預處理程序不對其做宏替換。內存

宏定義容許嵌套,在宏定義的字符串中可使用已經定義的宏名,在宏展開時由預處理程序層層代換。作用域

宏定義是用一個標識符來表示一個字符串,這個字符串能夠是常量、變量或表達式。在宏調用中將用該字符串代換宏名。字符串

 

可用宏定義表示數據類型,使書寫方便      如: #define INTEGER intinput

 

宏定義表示數據類型和typedef定義數聽說明符的區別

宏定義只是簡單的字符串代換,是在預處理時完成的,而tyoedef是在編譯時處理的,它不是簡單的代換,而是對數聽說明符從新命名。被命名的標識符具備類型定義說明的功能。io

對「輸出格式」做宏定義,能夠減小書寫麻煩。編譯

 

帶參宏定義

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

調用:     宏名(實參);

1. 帶參宏定義中,宏名和形參表之間不能有空格出現

2. 在帶參宏定義中,形參不分配內存單元,所以沒必要作類型定義。而宏調用中的實參有具體的值,要用它們去代換形參,所以必須作類型說明。

 

函數值傳遞  帶參宏定義只是符號代換,不存在值傳遞

在宏定義中,字符串內的形參一般要用括號括起來以免出錯。

#include<stdio.h>
#define SQ(y) (y)*(y)

void main()
{
	int a, sq;
	printf("input a number:");
	scanf_s("%d", &a);

	sq = SQ(a + 1);   //sq= (a+1) * (a+1)

	printf("sq=%d\n", sq);

	system("pause");
}
#include<stdio.h>
#define SQ(y) y*y

void main()
{
	int a, sq;
	printf("input a number:");
	scanf_s("%d", &a);

	sq = SQ(a + 1);   //sq= a+1 * a+1

	printf("sq=%d\n", sq);

	system("pause");
}

 

 

條件編譯

                    #ifdef    標識符

                     程序段1

                   #else

                     程序段2

                   #endif

若是標識符已被#define命令定義過 則對程序段1進行編譯;不然對程序段2進行編譯。

或:               #ifdef 標識符

                        程序段

                      #endif

 

 

                    #ifndef    標識符

                     程序段1

                   #else

                     程序段2

                   #endif

 

 

                    #ifdef    常量表達式  

                     程序段1

                   #else

                     程序段2

                   #endif

 

文件包含是預處理的一個重要功能,它可用來把多個源文件鏈接成一個源文件進行編譯,結果將生成一個目標文件。

相關文章
相關標籤/搜索