C語言的宏是用來間接的操作編譯環境的。
C語言在對源程序進行正常編譯之前,先對一些特殊的預處理命令作解釋,產生一個新的源程序,之後再進行通常的編譯(要得到中間文件加參數/p)。
在源程序中,為了區分預處理命令和一般的C語句的不同,所有預處理命令行都以符號#開頭並且宏一定要大寫哦,因為大家都是這樣做的,並且結尾不用分號。
預處理命令可以出現在程序的任何位置,但是習慣上盡可能地寫在源程序的開頭,其作用范圍從其出現的位置到文件尾。
不帶參數的宏定義:
#define 標識符 語句序列或者表達式
它的作用是在編譯預處理時,將源程序中所以標識符替換成語句序列。
宏常常用來定義符號常量,簡化一些標識符的書寫,部分的彌補了C語言沒有元素個數可變的數組的不足:例子:
#include <stdio.h>#define IN scanf#define OUT printf#define N 2void main(){ int i = 0; char name[N][20]; long num[N]; OUT("Please input name and ID:
"); for(i; i<N; i++) { IN("%s", name[i]); IN("%ld", &num[i]); } for(i=0; i<N; i++) { OUT("%s ", name[i]); OUT("%ld
", num[i]); }}
我們把這段代碼在VC6.0中編譯不鏈接,編譯不鏈接在VC6.0IDE的設置是這樣的,打開:
在Project Options後面加上/P參數。這樣你選擇只編譯
就可以就得到編譯預處理後的.i文件。我們再打開.i文件看看:
我們可以看到,N都被替換為2了,IN都替換為scanf了,OUT被替換為printf啦!所以這樣的控制編譯器預處理的語句通常叫預處理命令!
不帶參數的宏的好玩的地方。看代碼:
#include "stdio.h"#define dodolook int g_a1 = 0x12345678;static int g_a2 = 0x87654321;dodolook void go(){ //?x@?1??go@@YAXXZ@4HA static int x = 0x88888888; printf("%08x", x);}int main(){ //?x@?1??main@@9@4HA static int x = 0x12312312; int a = 111; int b = 222; dodolook go(); return (0);}