在线观看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

    文章

    7624

    瀏覽量

    139462
  • 源代碼
    +關注

    關注

    96

    文章

    2948

    瀏覽量

    67465
  • 代碼
    +關注

    關注

    30

    文章

    4872

    瀏覽量

    69913
  • 編譯
    +關注

    關注

    0

    文章

    673

    瀏覽量

    33470
  • 預處理
    +關注

    關注

    0

    文章

    33

    瀏覽量

    10576
收藏 人收藏

    評論

    相關推薦

    C語言常用的預處理命令

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

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

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

    C語言編譯預處理

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

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

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

    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 ?834次閱讀

    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 ?2397次閱讀

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

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

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

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

    為什么C語言要進行編譯

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

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

    C語言預處理是在編譯之前對源代碼進行處理的階段,它主要由預處理器完成。
    的頭像 發表于 12-08 15:40 ?759次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>有哪些<b class='flag-5'>預處理</b>操作?

    FPGA Verilog HDL語法之編譯預處理

    Verilog HDL語言C語言一樣也提供了編譯預處理的功能。“編譯
    的頭像 發表于 03-27 13:30 ?276次閱讀
    FPGA Verilog HDL語法之<b class='flag-5'>編譯</b><b class='flag-5'>預處理</b>
    主站蜘蛛池模板: 五月婷婷网站 | 色多多在线观看高清免费 | 1024手机看片国产 | 国产精品亚洲一区二区三区在线播放 | 四虎成人精品在永久在线观看 | 免费看欧美一级特黄α大片 | 日本特黄特色 | 久久精品午夜视频 | 亚色影视| 色天使色婷婷丁香久久综合 | 调教r18车肉高h男男 | 国产美女精品久久久久久久免费 | 久久精品男人影院 | 极品啪啪 | 久久天天干 | 四虎永久网址影院 | 国产网站免费视频 | 男人和女人做a免费视频 | 91网站在线看 | 综合激情网站 | 欧美日韩a | 分分操免费视频在线观看 | 香蕉狠狠再啪线视频 | 国模在线视频 | 日本最新免费网站 | 免费观看一级特黄三大片视频 | 婷婷午夜影院 | 永久免费精品影视网站 | 国产精品午夜寂寞视频 | 2016天天干 | 中国china体内裑精亚洲毛片 | 男人都懂得网址 | 狠狠色狠狠色综合日日32 | 国产三级a三级三级天天 | 色婷婷综合激情视频免费看 | 性生大片一级毛片免费观看 | 全国男人的天堂网站 | 国产成人精品日本亚洲语言 | 国产91久久最新观看地址 | 黄视频在线观看免费 | 免费看久久 |