91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言宏的定義與使用方法是什么

發布時間:2022-04-19 13:42:20 來源:億速云 閱讀:140 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“C語言宏的定義與使用方法是什么”,內容詳細,步驟清晰,細節處理妥當,希望這篇“C語言宏的定義與使用方法是什么”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

一、C語言中的宏定義

  • #define是預處理器處理的單元實體之一

  • #define 定義的宏可以出現在程序的任意位置

  • #define 定義之后的代碼都可以使用這個宏

  • #define 定義的宏常量可以直接使用

  • #define 定義的宏常量本質為字面量

下面的宏常量定義正確嗎?

C語言宏的定義與使用方法是什么

編寫代碼來測試:

#define ERROR -1
#define PATH1 "D:\test\test.c"
#define PATH2 D:\test\test.c
#define PATH3 D:\test\
test.c
 
int main()
{
    int err = ERROR;
    char* p1 = PATH1;
    char* p2 = PATH2;
    char* p3 = PATH3;
}

先使用gcc -E Test.c -o Test.i 進行預編譯,預編譯沒有報錯,結果如下:

# 1 "Test.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "Test.c"
 
int main()
{
    int err = -1;
    char* p1 = "D:\test\test.c";
    char* p2 = D:\test\test.c;
    char* p3 = D:\testtest.c;
}

直接進行編譯,發現 char* p2 = PATH2; char* p3 = PATH3; 報錯

C語言宏的定義與使用方法是什么

這說明宏定義是正確的,但是編譯是過不了的,只是

#define PATH2 D:\test\test.c

#define PATH3 D:\test\

不符合語法規范。

二、宏定義表達式

  • #define 表達式的使用類似函數調用

  • #define 表達式可以比函數更強大

  • #define 表達式比函數更容易出錯

強大之處其中之一就是可以求數組的大小,這是不能編寫函數辦到的。

下面看一段宏表達式的代碼:

#include <stdio.h>
 
#define _SUM_(a, b) (a) + (b)
#define _MIN_(a, b) ((a) < (b) ? (a) : (b))
#define _DIM_(a) sizeof(a)/sizeof(*a)
 
int main()
{
    int a = 1;
    int b = 2;
    int c[4] = {0};
 
    int s1 = _SUM_(a, b);
    int s2 = _SUM_(a, b) * _SUM_(a, b);
    int m = _MIN_(a++, b);
    int d = _DIM_(c);
 
    printf("s1 = %d\n", s1);
    printf("s2 = %d\n", s2);
    printf("m = %d\n", m);
    printf("d = %d\n", d);
 
    return 0;
}

下面為輸出結果,但是 s2 我們預期的結果應該是 9,m 的值我們預期的結果應該是 1,這是怎么回事呢?

C語言宏的定義與使用方法是什么

下面進行預編譯看看代碼到底是怎么運行的,輸入 gcc -E Test.c -o Test.i

int main()
{
    int a = 1;
    int b = 2;
    int c[4] = {0};
 
    int s1 = (a) + (b);
    int s2 = (a) + (b) * (a) + (b);
    int m = ((a++) < (b) ? (a++) : (b));
    int d = sizeof(c)/sizeof(*c);
 
    printf("s1 = %d\n", s1);
    printf("s2 = %d\n", s2);
    printf("m = %d\n", m);
    printf("d = %d\n", d);
 
    return 0;
}

通過上面宏定義的替換,我們很容易知道為什么結果跟我們想的不一樣。

三、宏表達式與函數的對比

  • 宏表達式被預處理器處理,編譯器不知道宏表達式的存在

  • 宏表達式用“實參”完全替代形參,不進行任何運算

  • 宏表達式沒有任何的“調用”開銷

  • 宏表達式中不能出現遞歸定義

所以,下面遞歸定義就是錯誤的:

C語言宏的定義與使用方法是什么

四、有趣的問題

宏定義的常量或表達式是否有作用域限制?(沒有)

下面看一個宏作用域分析的代碼:

#include <stdio.h>
 
void def()
{
    #define PI 3.1415926
    #define AREA(r) r * r * PI
}
 
double area(double r)
{
    return AREA(r);
}
 
int main()
{
    double r = area(5);
 
    printf("PI = %f\n", PI);
    printf("d = 5; a = %f\n", r);
    
    return 0;
}

下面為輸出結果:

C語言宏的定義與使用方法是什么

作用域的概念是針對 C 語言中的變量和函數,不針對宏。宏表達式被預處理器處理,編譯器不知道宏表達式的存在。

五、強大的內置宏

含義示例
_FILE_被編譯的文件名file1.c
_LINE_當前行號25
_DATE_編譯時的日期Jan 31 2021
_TIME_編譯時的時間17:01:01
_STDC_編譯器是否遵循標準C規范1

下面看一個宏使用的綜合示例:

#include <stdio.h>
#include <malloc.h>
 
#define MALLOC(type, x) (type*)malloc(sizeof(type)*x)
 
#define FREE(p) (free(p), p=NULL)
 
#define LOG(s) printf("[%s] {%s:%d} %s \n", __DATE__, __FILE__, __LINE__, s)
 
#define FOREACH(i, m) for(i=0; i<m; i++)
#define BEGIN {
#define END   }
 
int main()
{
    int x = 0;
    int* p = MALLOC(int, 5);
    
    LOG("Begin to run main code...");
    
    FOREACH(x, 5)
    BEGIN
        p[x] = x;
    END
    
    FOREACH(x, 5)
    BEGIN
        printf("%d\n", p[x]);
    END
    
    FREE(p);
    
    LOG("End");
    
    return 0;
}

下面為輸出結果:

C語言宏的定義與使用方法是什么

可以看到宏定義是很強大的,可以打印出日期,文件名,行號,不使用宏定義很難實現。

讀到這里,這篇“C語言宏的定義與使用方法是什么”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

建昌县| 滨州市| 临江市| 怀仁县| 即墨市| 龙州县| 镇平县| 霸州市| 德令哈市| 普定县| 湖口县| 城市| 仁怀市| 太和县| 台山市| 漠河县| 明星| 呼玛县| 萨嘎县| 肥乡县| 金华市| 宁阳县| 宾阳县| 西盟| 霍城县| 疏勒县| 昌平区| 康乐县| 邯郸县| 兴义市| 淮安市| 江城| 屯昌县| 拉萨市| 威海市| 黄骅市| 于田县| 孝昌县| 巴林左旗| 应用必备| 四会市|