程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 我也要學C語言-第十二章:編譯預處理——不帶參數的宏

我也要學C語言-第十二章:編譯預處理——不帶參數的宏

編輯:關於C語言

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved