亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

什么是預(yù)處理命令

預(yù)處理命令在我之前看過(guò)的C語(yǔ)言基礎(chǔ)教程中好像并沒(méi)有詳細(xì)說(shuō)到,在現(xiàn)在的一些項(xiàng)目中預(yù)處理命令的出現(xiàn)頻率卻越來(lái)越多。事物的存在必有其存在的理由,于是就花時(shí)間去琢磨了一下,以及查閱相關(guān)資料,發(fā)現(xiàn)使用預(yù)處理命令去優(yōu)化代碼可以達(dá)到很好的效果。預(yù)處理命令在某資料中是這樣描述的"C程序的源代碼中可包括各種編譯指令,這些指令稱為預(yù)處理命令。雖然它們實(shí)際上不是C語(yǔ)言的一部分,但卻擴(kuò)展了C程序設(shè)計(jì)的環(huán)境"。預(yù)處理命令實(shí)質(zhì)上是運(yùn)行在編譯器編譯過(guò)程的指令。所以說(shuō)在嵌入式程序設(shè)計(jì)中使用預(yù)處理命令不會(huì)占用最終目標(biāo)運(yùn)行系統(tǒng)的存儲(chǔ)空間。

預(yù)處理命令有哪些

在ANSI標(biāo)準(zhǔn)定義的C語(yǔ)言預(yù)處理程序中包括下列命令:

#include,#define,#if,#else,#elif,#endif,#ifdef,#ifndef,#error,#undef,#line,#pragma等。從以上可以看出預(yù)處理命令的共同特點(diǎn)就是以"#"開(kāi)頭。下面就分別介紹幾個(gè)在項(xiàng)目中使用比較多的預(yù)處理命令。

  1. #include

這個(gè)預(yù)處理命令算是使用的最多而又最重要的一個(gè)預(yù)處理命令了。它的作用你是否還記得?include就是"包含"的意思,在程序編譯的時(shí)候預(yù)處理器看到#include就會(huì)把<>尖括號(hào)或者" "中的那個(gè)文件找到,然后用該文件的內(nèi)容替換掉#include <>這一行。

使用方法或者格式:

#include <xxx.h>
  1. #define

#define叫做宏定義,標(biāo)識(shí)符為所定義的宏名,簡(jiǎn)稱宏。標(biāo)識(shí)符的命名規(guī)則與前面講的變量的命名規(guī)則是一樣的。#define 的功能是將標(biāo)識(shí)符定義為其后的常量。一經(jīng)定義,程序中就可以直接用標(biāo)識(shí)符來(lái)表示這個(gè)常量。是不是與定義變量類似?但是要區(qū)分開(kāi)!變量名表示的是一個(gè)變量,但宏名表示的是一個(gè)常量。可以給變量賦值,但絕不能給常量賦值。宏所表示的常量可以是數(shù)字、字符、字符串、表達(dá)式。使用宏定義可以用宏代替一個(gè)在程序中經(jīng)常使用的常量。注意,是"經(jīng)常"使用的。這樣,當(dāng)需要改變這個(gè)常量的值時(shí),就不需要對(duì)整個(gè)程序一個(gè)一個(gè)進(jìn)行修改,只需修改宏定義中的常量即可。且當(dāng)常量比較長(zhǎng)時(shí),使用宏就可以用較短的有意義的標(biāo)識(shí)符來(lái)代替它,這樣編程的時(shí)候就會(huì)更方便,不容易出錯(cuò)。因此,宏定義的優(yōu)點(diǎn)就是方便和易于維護(hù)。

需要注意的是,預(yù)處理指令不是語(yǔ)句,所以后面不能加分號(hào)。

使用方法或者格式:

#define xxx 1 //定義常量
#define xxx 'a' //定義字符
#define xxx "abcb" //定義字符串
#define xxx abc() //定義函數(shù)

還可以這樣:

#define XX_ABS(x) ((x)>=0? (x):-(x)) //返回絕對(duì)值
#define XX_SIGN(x) ((x<0)?-1:((x>0)?1:0)) //正數(shù)返回 1,負(fù)數(shù)返回 -1 零返回 0
  1. #ifndef

#ifndef是"if not defined"的簡(jiǎn)寫(xiě),是宏定義的一種,它是可以根據(jù)是否已經(jīng)定義了一個(gè)變量來(lái)進(jìn)行分支選擇,一般用于調(diào)試等。實(shí)際上確切地說(shuō)這應(yīng)該是預(yù)處理功能中三種(宏定義,文件包含和條件編譯)中的第三種——條件編譯。

條件指示符#ifndef的最主要目的是防止頭文件的重復(fù)包含和編譯。條件編譯當(dāng)然也可以用條件語(yǔ)句來(lái)實(shí)現(xiàn), 但是用條件語(yǔ)句將會(huì)對(duì)整個(gè)源程序進(jìn)行編譯,生成的目標(biāo)代碼程序很長(zhǎng),而采用條件編譯,則根據(jù)條件只編譯其中的程序段1或程序段2,生成的目標(biāo)程序較短。如果條件選擇的程序段很長(zhǎng),采用條件編譯的方法是十分必要的。

假如你有一個(gè)C源文件,它包含了多個(gè)頭文件,比如頭文件A和頭文件B,而頭文件B又包含了頭文件A,則最終的效果是,該源文件包含了兩次頭文件A。如果你在頭文件A里定義了結(jié)構(gòu)體或者類類型(這是最常見(jiàn)的情況),那么問(wèn)題來(lái)了,編譯時(shí)會(huì)報(bào)大量的重復(fù)定義錯(cuò)誤。

使用方法或者格式:

//經(jīng)常在H文件(頭文件)看到是格式:
#ifndef 標(biāo)識(shí)符
#define 標(biāo)識(shí)符
/*************
程序段
***************/
#endif

其他格式:

#ifndef表達(dá)式
/***********
程序段 1
***********/
#else
/***********
程序段 2
***********/
#endif
  1. #if,#else,#elif,#endif

#if,#else,#elif#endif通常是組合使用,#if 叫條件預(yù)處理命令主要作用跟if判斷語(yǔ)句相似,格式上的區(qū)別在在于使用#if需要使用#endif以表示結(jié)束。否則編譯器會(huì)報(bào)錯(cuò)。主要作用就是通過(guò)判斷條件是否滿足去選擇編譯程序段。

使用方法或者格式:

格式1

#if XXX
/*****
程序段
*****/
#endif

格式2

#if XXX
/*****
程序段1
*****/
#else
/*****
程序段2
*****/
#endif

格式3

#ifndef XXX   0 //
#if (XXX==1)
/*****
程序段1
*****/
#elif (XXX==2)
/*****
程序段2
*****/
#else
/*****
程序段3
*****/
#endif

在以上的格式基礎(chǔ)上如果再加上#define宏定義就更好地去控制了。比如下面的這個(gè)例子:

在一個(gè)嵌入式的小系統(tǒng)中有兩種調(diào)試方式,一種是串口調(diào)試,一種是USB轉(zhuǎn)串口調(diào)試。串口調(diào)試一般使用在系統(tǒng)程序開(kāi)發(fā)階段調(diào)試。而USB轉(zhuǎn)串口調(diào)試一般使用在系統(tǒng)開(kāi)發(fā)完成后的功能調(diào)試,因?yàn)閁SB還可以實(shí)現(xiàn)文件系統(tǒng)的掛載,在后期使用USB進(jìn)行固件升級(jí)是非常方便的。現(xiàn)在的問(wèn)題就是用什么方法可以更簡(jiǎn)單地實(shí)現(xiàn)串口調(diào)試與USB轉(zhuǎn)串口調(diào)試的快速轉(zhuǎn)換。

其中的方法之一就是使用條件預(yù)處理命令實(shí)現(xiàn)切換,

有四個(gè)函數(shù):

USB_Init();
Usb_printf(char *p); //向usb轉(zhuǎn)串口打印調(diào)試信息
Usart_Init();
Usart_printf(char *p); //向串口打印調(diào)試信息

實(shí)例過(guò)程如下:

#define PRMOS 0 //0 使用串口打印 1 使用usb打印信息

#if PRMOS
		#define DEBUG(s) Usb_printf(s)
#else
		#define DEBUG(s) Usart_printf(s)
#endif

int main(void)
{
    #if PRMOS
    USB_Init();
    #else
    Usart_Init();
    #endif
      While(1)
      {
          DEBUG("Hello, World! n");
          Delay_ms(1000);
      }
}

大致的思路就是使用#define定義一個(gè)常量和使用同一個(gè)標(biāo)識(shí)符分別定義串口打印函數(shù)和usb打印函數(shù),然后使用條件判斷預(yù)處理#if通過(guò)判斷PRMOS標(biāo)識(shí)符選擇編譯哪一部分,在程序設(shè)計(jì)的時(shí)候也需要使用#if把USB和串口相關(guān)的代碼區(qū)分開(kāi)。這樣在編譯的時(shí)候始終都是編譯一部分,所以整體的編譯速度或者占用空間都是比較少的。在功能切換時(shí)只需要更改PRMOS的值就完成了全部代碼的修改,這樣是不是很方便。

這種程序設(shè)計(jì)方法在一些實(shí)時(shí)操作系統(tǒng)的配置中使用的比較多,例如FreeRTOS中的功能配置

C語(yǔ)言編程中的預(yù)處理命令你會(huì)用嗎?

 


C語(yǔ)言編程中的預(yù)處理命令你會(huì)用嗎?

 

總結(jié)。預(yù)處理命令主要是使用在程序的優(yōu)化上。可以使程序設(shè)計(jì)更靈活更好看等等。

分享到:
標(biāo)簽:預(yù)處理 命令
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定