C語言的宏macro的使用

C's Macro Introduction

1.The Connect Macros: ##

這是一個預處理鏈接符,這個操做符主要用來將兩個符號鏈接成爲一個完整的宏符號。經過下面的代碼,能夠看到其具體的使用方法:html

  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__宏當中。3d

  1. 運行結果以下所示:

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)稱爲函數時宏定義。具體例子以下:code

  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的使用htm

相關文章
相關標籤/搜索