首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言前置處理器:無參數巨集定義與編譯預處理實戰

     編輯:關於C語言

前置處理基礎

  • 所有指令以 # 開頭,巨集名慣例全大寫,行尾無分號。
  • 作用範圍:從出現位置到檔案結尾。
  • 編譯前先展開巨集,產生新原始碼,再進入正式編譯。

無參數巨集語法

#define 識別碼 替換文本

預處理階段將原始碼中所有 識別碼 替換為 替換文本。常用於:

  1. 符號常數(如 #define N 10)
  2. 簡化關鍵字/函數名(如 #define IN scanf)
  3. 部分彌補 C 無可變長度陣列的不足

實戰範例:巨集展開檢視

#include <stdio.h>
#define IN scanf
#define OUT printf
#define N 2
void 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 專案設定 /P 參數僅預處理產生 .i 檔,打開可見:

char name[2][20];
long num[2];
printf("Please input name and ID: ");
for(i; i<2; i++) { scanf("%s", name[i]); scanf("%ld", &num[i]); }
...

所有 N、IN、OUT 均已替換。

進階技巧:巨集定義程式碼片段

#define dodolook int g_a1 = 0x12345678; static int g_a2 = 0x87654321;
dodolook void go() { static int x = 0x88888888; printf("%08x", x); }
int main() { static int x = 0x12312312; dodolook go(); return 0; }

巨集可插入聲明、定義、甚至整個程式碼區塊,極具靈活性但也易濫用,需謹慎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved