無參宏的宏名後不帶參數。css
#define 標識符 字符串函數
define爲宏定義命令。「標識符」爲所定義的宏名(通常用大寫字母)。「字符串」能夠是常數、表達式、字符串等。spa
宏定義必須寫在函數以外,其做用域爲宏定義命令起到源程序結束。如要終止其做用域可以使用#undef命令code
宏名在源程序中若用引號括起來,則預處理程序不對其做宏替換。內存
宏定義容許嵌套,在宏定義的字符串中可使用已經定義的宏名,在宏展開時由預處理程序層層代換。作用域
宏定義是用一個標識符來表示一個字符串,這個字符串能夠是常量、變量或表達式。在宏調用中將用該字符串代換宏名。字符串
可用宏定義表示數據類型,使書寫方便 如: #define INTEGER intinput
宏定義只是簡單的字符串代換,是在預處理時完成的,而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
文件包含是預處理的一個重要功能,它可用來把多個源文件鏈接成一個源文件進行編譯,結果將生成一個目標文件。