C语言基础:预处理指令
本文基于一個(gè)簡(jiǎn)單的Simulink生成的代碼,研究MBD中比較常見的一些預(yù)處理指令。
文章目錄
- 1 C語言預(yù)處理指令
- 2 #include
- 3 #define
- 4 #ifndef...#endif
- 5 #pragma
- 6 總結(jié)
1 C語言預(yù)處理指令
預(yù)處理是C語言編譯過程中最初的一步,博主理解,預(yù)處理指令就是在預(yù)處理階段告訴編譯器要做些啥。
預(yù)處理指令很好辨別,一個(gè)單詞以#開頭就是預(yù)處理指令。如果用Notepad++打開,那么咖啡色的一大串就是預(yù)處理指令的東西了。
下面會(huì)簡(jiǎn)單講講博主目前在MBD的工作中比較常見的預(yù)處理指令,并做一些通俗的解釋。
2 #include
#include預(yù)處理指令后面會(huì)跟著一個(gè)頭文件。系統(tǒng)庫(kù)的頭文件和用戶自己寫的頭文件長(zhǎng)得是不一樣的。例如下面的<stdio.h>是系統(tǒng)頭文件,"myheader.h"是用戶頭文件。博主剛上班的時(shí)候就沒分清楚,還好自己百度了一下,沒拿去問別人,不然丟人就丟到家了。
#include <stdio.h> #include "myheader.h"#include其實(shí)就是告訴編譯器,把這個(gè)頭文件的內(nèi)容添加到當(dāng)前的源文件中。頭文件中一般都會(huì)有一些變量聲明,函數(shù)聲明什么的,供各種C文件調(diào)用。
如果不做特殊配置,Embedded Coder就會(huì)生成一個(gè)和源文件同名的頭文件。這個(gè)頭文件中包含源文件的全局變量聲明,函數(shù)聲明,也會(huì)包含其他頭文件。
3 #define
1.#define是宏定義的意思,簡(jiǎn)單理解就是換個(gè)馬甲。比方說下面的宏定義:
#define FILE_SIZE 42這里理解就是,編譯器遇到了這一行宏定義了以后,就知道后面如果遇到了FILE_SIZE,就把這一串字符換成42這個(gè)數(shù)字來處理。
2.當(dāng)然,除了賦予數(shù)字一個(gè)含義以外,也可以把字符換成字符。
#define name1 name2這里就是遇到了name1,就把他當(dāng)成name2。適用于模型開發(fā)中,假如兩個(gè)接口都是同一個(gè)變量,但是又因?yàn)槟撤N原因不能改名字,那就手寫個(gè)宏定義來轉(zhuǎn)換一下。
3.還有另一種情況,#define后面只跟了一個(gè)名字,沒有第二個(gè)名字。
#define name1這代表著告訴編譯器,有這么一個(gè)宏,一般會(huì)配合其他預(yù)處理指令使用,比方說條件編譯。
4 #ifndef…#endif
Embedded Coder生成的頭文件中,總是能在一開始(除了注釋)就有一個(gè)#ifndef,然后結(jié)尾有一個(gè)#endif。
這是一種條件編譯。#ifndef后面跟了個(gè)宏,意思是如果沒有定義這個(gè)宏,就編譯#endif之前的一段代碼;以前有定義過這個(gè)宏,就把這整段跳過去。在上述截圖中,使用#ifndef來做了個(gè)防止重復(fù)編譯本頭文件內(nèi)容的機(jī)制。
這個(gè)機(jī)制的意義在于,當(dāng)?shù)谝淮斡龅搅薈代碼包含了這個(gè)頭文件的時(shí)候,沒有定義過RTW_HEADER_rtmodel_h_這個(gè)宏,然后編譯器就會(huì)加載本頭文件中endif之前的內(nèi)容。如果下一次別的C代碼中也包含了這個(gè)頭文件,因?yàn)榈谝淮味x了宏,所以后面就不會(huì)再去加載了,省的做重復(fù)的事情。
(抱歉博主表達(dá)能力有限,這部分感覺自己理解的以及講的都不清楚。)
相對(duì)應(yīng)的,也有一個(gè)#ifdef預(yù)處理指令,和#ifndef意思相反,是定義過宏的情況下才加載內(nèi)容。還有#else,#elif。
手寫代碼中,會(huì)用這種條件編譯來做一個(gè)“開關(guān)”,以方便調(diào)試不同情況下用哪一大段代碼。
5 #pragma
#pragma指令比較復(fù)雜,不過博主目前再M(fèi)BD中遇到的只有#pragma section,用來控制代碼或者全局變量在控制器中存放的地址。
這部分比較復(fù)雜,涉及到鏈接的很多知識(shí),先留個(gè)坑,以后有了深入的理解以后再來記錄下來。以免現(xiàn)在說錯(cuò)了會(huì)誤人子弟。
6 總結(jié)
MBD中比較常用的預(yù)處理指令也就上面這些了。
>>返回個(gè)人博客總目錄
總結(jié)
以上是生活随笔為你收集整理的C语言基础:预处理指令的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: USB驱动程序(四)——键盘驱动(控制传
- 下一篇: 关于esxi主机上vm无法ping通ed