C語言的宏macro的使用


C's Macro Introduction

1.The Connect Macros: ##

這是一個預處理連接符,這個操作符主要用來將兩個符號連接成為一個完整的宏符號。通過下面的代碼,可以看到其具體的使用方法:

  1. 如下例子:
#include <stdio.h>
struct macro
{
    int N;
    char M;
};
struct macro macro_drv = {100,20};
#define XNAME(n) x##n
#define Macro(x) x##_drv.N

int main(void)
{
    char *XNAME(3) = "Hello,Macro(##)\n";
    printf("%s",XNAME(3));
    printf("The struct:%d\n",Macro(macro));
    return 0;
}
  1. 運行結果如下所示:
    Res

2.The Variadic Macros: ... and __VA_ARGS__

在某些函數當中,需要接收變化數量的參數,例如基本的printf函數。
我們可以通過將函數的最后一個參數定義為宏...,這樣函數就可以使用預定義的宏__VA_ARGS__來表示變化數量的變量了。

  1. 如下例子:
#include <stdio.h>
#define PR(x,...) printf("Message" #x ":" __VA_ARGS__)
#define VA(x,y,...) printf(#x" "#y" "#__VA_ARGS__)

int main(void)
{
    PR(1,"%s,%s\n","Hello","Macro");
    VA(I,am,Superman!);
    return 0;
}

上述程序中輸入給PR函數的參數一共有4個:1,"%s,%s\n","Hello","Macro",第一個參數是保存在x形參中的,剩下的三個參數保存在__VA_ARGS__宏當中。
2. 運行結果如下所示:

3.The Other Macros:__FILE__ __LINE__ __FUNCTION__

  1. 基本概念:
  • FILE:宏在預編譯時會替換成當前的源文件名.
  • LINE:宏在預編譯時會替換成當前的行號.
  • FUNCTION:宏在預編譯時會替換成當前的函數名稱.
  • TIME:在源文件中插入當前編譯時間.
  • DATE:在源文件中插入當前的編譯日期.
  1. Coding:
#include <stdio.h>

int main(void)
{
    printf("The Source File Name:%s\n",__FILE__);
    printf("Current Code Line:%d\n",__LINE__);
    printf("Current Func Name:%s\n",__FUNCTION__);
    return 0;
}
當程序在預編譯過程當中,上述的三種宏就被替換成了對應的數值或者字符串了。  
  1. 運行結果:

4.The FUNC Macro.

通常我們將某些簡短的函數直接改寫為宏定義,這就減少了我們在調用過程中的代碼編寫。
#define pi 3.14稱作變量式宏定義,再如#define MAX(a,b) (a>b?a:b)稱為函數時宏定義。具體例子如下:

  1. Codeing:
#include <stdio.h>
#define E 4
#define PI 3.14
#undef E // 將定義完成的宏撤銷,可以重新定義一個名字叫E的宏.
#define E 3
#define MAX(a,b) ((a)>(b)?(a):(b))

int main(void)
{
    printf("The PI:%f\n",PI);
    printf("The Bigger:%f\n",MAX(PI,2.34));
    return 0;
}
  1. Result:
    Res

5.Reference

宏定義中的操作符
C語言的宏macro的使用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM