在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C語言必備知識編譯預處理

CHANBAEK ? 來源:小李的創客實驗室 ? 作者: 初出茅廬的小李 ? 2023-12-01 18:27 ? 次閱讀

C語言必備知識編譯預處理

編譯預處理就是在編譯源代碼之前進行的一系列處理,將源程序中的一些特殊命令進行展開或處理,生成擴展的源代碼。這些特殊命令通常以“#”開頭,占單獨的行,語句尾部不需要加分號。

宏定義

(#define)是一種常見的編譯預處理指令,用于定義宏,實現代碼的簡化和重用。

文件包含(#include)用于在源文件中引入其他文件的內容,方便代碼模塊化和復用。

條件編譯

(#if, #else, #endif等)允許根據條件選擇性地編譯部分代碼,提高代碼的靈活性。

在預處理階段,這些指令會被解釋和處理,生成經過預處理的源代碼,然后再經過編譯、匯編、鏈接等步驟生成最終的可執行文件。這個過程有助于提高代碼的可維護性和可移植性。

書寫格式

以“#”開頭、占單獨行、語句尾不加分號。這樣的規范有助于編譯器正確解釋和處理這些指令,同時也使得代碼更加清晰易讀。這樣的一致性規范有助于維護代碼時的可讀性和可理解性。

宏定義的例子

// 定義常量

#include < stdio.h >

#define MAX_SIZE 100
#define PI 3.1415926

// 簡化代碼
#define SQUARE(x) ((x) * (x))
#define MAX(a, b) ((a) > (b) ? (a) : (b))


#define DEBUG   //只要定義了該宏 DEBUG_PRINT就會起作用 沒有定義則不起作用 

// 字符串拼接

//#define CONCAT_STR(a,b) a##b dev平臺用不了 linux未測試
#define CONCAT_STR(a,b) a b

// 條件編譯
#ifdef DEBUG
    #define DEBUG_PRINT(msg) printf("Debug: %sn", msg)
#else
    #define DEBUG_PRINT(msg)
#endif




int main(void) 
{
	
	printf("5的平方是%drn",SQUARE(5));
	printf("MAX(2,3)返回較大的一個數是%drn",MAX(2,3)) ;
	DEBUG_PRINT("調試信息"); 
	printf("%srn", CONCAT_STR("你好", "World"));  // 這里會被展開為 printf("%srn", "你好, " "World");
}

這里踩到了一個坑............. dev里這個##符號竟然不能使用!看了這個博主的文章才明白 https://blog.csdn.net/leon1741/article/details/78149881,致謝致敬圖片

運行結果

圖片
在這里插入圖片描述

宏定義使用注意事項

使用宏定義時需要注意一些事項,以確保代碼的可讀性和正確性。以下是一些宏定義的注意事項:

  1. 括號的使用:
    在宏定義中,為了避免優先級問題,通常在宏的參數和整體表達式外部都使用括號。例如:

    #define SQUARE(x) ((x) * (x))
    

    這樣可以確保在使用時不會出現預期之外的行為。

  2. 避免副作用:
    在宏中避免使用具有副作用的表達式,因為宏是簡單的文本替換,可能導致意外的行為。

    // 避免這樣的宏定義
    #define INCREMENT(x) x++
    
  3. 使用大寫字母:
    為了與變量和函數名區分,宏的名稱通常使用大寫字母。

    #define MAX_SIZE 100
    
  4. 多行宏的注意:
    如果宏跨越多行,確保在每行的末尾使用反斜杠 連接,以避免語法錯誤。

    #define PRINT_SUM(a, b) 
        do { 
            int sum = (a) + (b); 
            printf("Sum: %dn", sum); 
        } while(0)
    
  5. 參數的使用:
    宏參數的使用要小心,確保在宏展開時不會導致預期之外的結果。

    // 不要這樣使用,可能導致問題
    #define SQUARE(x) x * x
    
  6. 條件編譯:
    在使用條件編譯時,確保相關的宏定義和取消定義都是正確的。

    #ifdef DEBUG
        // ...
    #endif
    

總體來說,清晰、簡潔、避免副作用是設計宏定義時的關鍵原則。良好的宏定義可以提高代碼的可讀性和可維護性。

單片機中可以使用預編譯來區分代碼版本

如果定義了REG_CODE 這個宏且其結果是1那么就是寄存器版本代碼否則就是庫函數版本代碼

void LED_Config(void)
{
	#if (REG_CODE)
	
	RCC- >AHB1ENR |= 1< 2;      //GPIOC的時鐘開關

	GPIOC- >MODER &= ~(3< 2*4);//把89位清00 PC4
	GPIOC- >MODER |=  (1< 2*4);//只是把第89位置01
	
	GPIOC- >MODER &= ~(3< 2*5);//把10 11位清00 PC5
	GPIOC- >MODER |=  (1< 2*5);//只是把第89位置01
	
	GPIOC- >MODER &= ~(3< 2*6);//把11 12位清00 PC6
	GPIOC- >MODER |=  (1< 2*6);//只是把第89位置01
	
	GPIOC- >MODER &= ~(3< 2*7);//把89位清00  PC7
	GPIOC- >MODER |=  (1< 2*7);//只是把第89位置01
	
	GPIOC- >OTYPER &= ~(1< 4); //推挽模式//0xFFFF FFEF 
	GPIOC- >OTYPER &= ~(1< 5);
	GPIOC- >OTYPER &= ~(1< 6);
	GPIOC- >OTYPER &= ~(1< 7);
	
	
	//假設輸出狀態 燈的開關
	GPIOC- >ODR |=  (1< 4)| (1< 5)|(1< 6) |(1< 7);  //默認全關
	printf("寄存器代碼...rn");
	#else
	printf("LED庫函數代碼...rn");
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
	
    GPIO_InitTypeDef  GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode   = GPIO_Mode_OUT;
	GPIO_InitStruct.GPIO_OType  = GPIO_OType_PP;
	GPIO_InitStruct.GPIO_Pin    = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
	GPIO_InitStruct.GPIO_PuPd   = GPIO_PuPd_NOPULL;
	GPIO_InitStruct.GPIO_Speed  = GPIO_High_Speed;
	
	GPIO_Init(GPIOB,&GPIO_InitStruct);
	
	
	#endif
	
}

至此,預編譯相關的知識點就介紹完了。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7615

    瀏覽量

    137827
  • 源代碼
    +關注

    關注

    96

    文章

    2946

    瀏覽量

    66989
  • 代碼
    +關注

    關注

    30

    文章

    4836

    瀏覽量

    69119
  • 編譯
    +關注

    關注

    0

    文章

    662

    瀏覽量

    33067
  • 預處理
    +關注

    關注

    0

    文章

    33

    瀏覽量

    10514
收藏 人收藏

    評論

    相關推薦

    C語言常用的預處理命令

    1.基礎知識(1)C語言常用的預處理命令——typedef具體可見C語言基礎語法
    發表于 07-14 07:10

    c語言預處理命令以什么開頭

    c語言預處理命令以什么開頭,目前我并沒有windows軟件編寫經驗,對C語言的應用也僅限于各種單片機的編程,所以對
    發表于 07-20 07:00

    介紹一下C語言預處理知識與宏定義原理

    系統平臺上的gcc)前言本篇文章將會向大家介紹一下C語言預處理知識、宏定義、函數、以及編譯執行程序所需的靜態鏈接庫和動態鏈接庫的一些原理,
    發表于 02-11 06:35

    C語言編譯預處理

    在將一個C源程序轉換為可執行程序的過程中, 編譯預處理是最初的步驟. 這一步驟是由預處理器(preprocessor)來完成的. 在源流程序被編譯
    發表于 09-20 18:17 ?47次下載

    基于51單片機--C語言預處理總結

    編譯預處理器是C語言編譯器的一個重要組成部分。很好的利用C
    發表于 08-17 10:48 ?1105次閱讀

    C程序設計教程之如何進行編譯預處理

    預處理C 語言的一個重要功能,它由預處理程序負責完成。所謂預處理是指在進行編譯的第一遍掃描(
    發表于 11-02 15:47 ?5次下載

    C語言程序設計教程之如何進行函數與編譯預處理資料概述

    本文檔的主要內容詳細介紹的是C語言程序設計教程之如何進行函數與編譯預處理資料概述主要內容包括了:1 函數概述2 函數定義與調用3 局部變量和全局變量4 變量的生存期和存儲類別5
    發表于 12-10 17:16 ?4次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>程序設計教程之如何進行函數與<b class='flag-5'>編譯</b><b class='flag-5'>預處理</b>資料概述

    C語言程序設計教程之編譯預處理的詳細資料說明

    本文檔的主要內容詳細介紹的是C語言程序設計教程之編譯預處理的詳細資料說明主要內容包括了:1.宏定義 2.文件包含 3.條件編譯
    發表于 01-08 14:19 ?2次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>程序設計教程之<b class='flag-5'>編譯</b><b class='flag-5'>預處理</b>的詳細資料說明

    淺析VerilogHDL編譯系統的預處理

    。在Verilog HDL語言編譯時,特定的編譯指令在整個編譯過程中有效(編譯過程可跨越多個文件),直到遇到其他不同的
    發表于 03-26 16:10 ?785次閱讀

    C語言預處理命令的分類和工作原理詳細說明

    器,故在閱讀或開發 C/C++ 程序過程中,可能會接觸大量的預處理指令。 1、預處理指令及分類 C/C
    發表于 11-25 10:34 ?18次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>預處理</b>命令的分類和工作原理詳細說明

    C語言預處理指令及分類

    C/C++ 程序中的源代碼中包含以 # 開頭的各種編譯指令,這些指令稱為預處理指令。預處理指令不屬于 C
    的頭像 發表于 11-29 10:14 ?2325次閱讀

    C語言宏定義與預處理、函數和函數庫

    系統平臺上的gcc)前言本篇文章將會向大家介紹一下C語言預處理知識、宏定義、函數、以及編譯執行程序所需的靜態鏈接庫和動態鏈接庫的一些原理,
    發表于 12-07 21:06 ?2次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>宏定義與<b class='flag-5'>預處理</b>、函數和函數庫

    C語言-預處理(#define、#if...)

    C語言程序里,出現的#開頭的代碼段都屬于預處理預處理:是在程序編譯階段就執行的代碼段。
    的頭像 發表于 08-14 10:13 ?2714次閱讀

    為什么C語言要進行編譯

    為什么我們編寫的C語言要進行編譯?什么是編譯編譯時發生了什么? 機器無法理解我們編寫的C
    的頭像 發表于 11-24 15:47 ?1465次閱讀
    為什么<b class='flag-5'>C</b><b class='flag-5'>語言</b>要進行<b class='flag-5'>編譯</b>

    C語言有哪些預處理操作?

    C語言預處理是在編譯之前對源代碼進行處理的階段,它主要由預處理器完成。
    的頭像 發表于 12-08 15:40 ?682次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>有哪些<b class='flag-5'>預處理</b>操作?
    主站蜘蛛池模板: 轻点太大了好深好爽h文 | 97伊人久久 | 欧美日韩乱国产 | 天天噜夜夜操 | 黄色特级录像 | 国产三级日本三级日产三级66 | 成人精品在线观看 | avtt亚洲一区中文字幕 | 好硬好大好爽女房东在线观看 | 久久精品高清 | 四虎永久免费地ww4hu57 | 二区三区在线观看 | 艹逼视频免费观看 | 午夜8050| 国产性做久久久久久 | 51影院在线观看成人免费 | 四虎库 | 午夜 福利 视频 | 国产一级鲁丝片 | 狠狠噜噜 | 日韩亚洲人成在线综合日本 | 免费美剧在线观看 | 一区一精品 | 好大好硬好长好爽a网站 | 不卡精品国产_亚洲人成在线 | 午夜影院黄 | 久久天天躁狠狠躁夜夜呲 | 色老久久精品偷偷鲁一区 | 国产你懂的在线观看 | 亚洲韩国日本欧美一区二区三区 | 天天爽夜夜春 | 夜恋秀场欧美成人影院 | 亚洲爽视频 | 最新版天堂中文在线官网 | 天天碰视频 | 天天干天天干天天干天天干天天干 | 欧美午夜视频一区二区三区 | 五月婷婷激情五月 | 亚洲伊人网站 | 简单视频在线播放jdav | 亚洲精品色一区色二区色三区 |