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