MISRA C-2012準則之聲明與定義

目錄

一、MISRA C簡介

二、聲明與定義

1. 必需。類型應被顯式聲明。

2. 必需。函數應以原型形式命名參數。

3. 必需。所有對象和函數的聲明需要使用完全相同的名字和參數。

4. 必需。當定義有外部鏈接的對象或函數時,兼容聲明應是可見的。

5. 必需。外部變量或函數應被在僅一個文件內被聲明過。

6. 必需。有外部鏈接的標識符應有一個確切的外部定義。

7. 建議。若函數和對象僅被一個單元引用,最好不定義外部鏈接。

8. 必需。靜態存儲類說明符應在所有具有內部鏈接的對象和函數的聲明中使用。

9. 建議。如果一個對象的標識符僅在一個函數內出現,該對象應被定義在塊范圍內。

10. 必需。內聯函數定義時應用靜態存儲類聲明。

11. 建議。當有外部鏈接的數組被定義,應顯式指定其大小。

12. 必需。枚舉列表內的枚舉值應獨一無二。

13. 建議。指針最好指向一個const類型的變量。

14. 必需。不得使用restrict限定詞。


?相關文章如下:

1、《MISRA C-2012準則之標準C環境準則

2、《MISRA C-2012準則之未使用的代碼的處理

3、《MISRA C-2012準則之注釋

4、《MISRA C-2012準則之標識符

5、《MISRA C-2012準則之常量

6、《MISRA C-2012準則之聲明與定義

7、《MISRA C-2012準則之初始化

8、《MISRA C-2012準則之基本數據類型

9、《MISRA C-2012準則之指針類型轉換

10、《MISRA C-2012準則之表達式

一、MISRA C簡介

MISRA C是由汽車產業軟件可靠性協會(MISRA)提出的C語言開發標準。其目的是在增進嵌入式系統的安全性及可移植性。

MISRA C一開始主要是針對汽車產業,不過其它產業也逐漸開始使用MISRA C:包括航天、電信、 ?國防、醫療設備、鐵路等領域中都已有廠商使用MISRA C。

MISRA C的第一版是在1998年發行,一般稱為MISRA-C:1998。在2004年時發行了第二版的MISRA C,稱作MISRA-C:2004。2012年發布第三版,為當前最新有效的C語言規范版本,稱為MISRA-C:2012。 MISRA C不能100%保證程序不出問題,但是能盡可能的預防,總結一下,基本上使用MISRA C具有以下五個維度的優勢:

1、提升可靠性

2、提升可讀性

3、提升可移植性

4、提升可維護性

5、提升安全性

二、聲明與定義

必需。類型應被顯式聲明。

必需。函數應以原型形式命名參數。

必需。所有對象和函數的聲明需要使用完全相同的名字和參數。

必需。當定義有外部鏈接的對象或函數時,兼容聲明應是可見的。、

必需。外部變量或函數應被在僅一個文件內被聲明過。

必需。有外部鏈接的標識符應有一個確切的外部定義。

建議。若函數和對象僅被一個單元引用,最好不定義外部鏈接。

必需。靜態存儲類說明符應在所有具有內部鏈接的對象和函數的聲明中使用。

建議。如果一個對象的標識符僅在一個函數內出現,該對象應被定義在塊范圍內。

必需。內聯函數定義時應用靜態存儲類聲明。

建議。當有外部鏈接的數組被定義,應顯式指定其大小。

必需。枚舉列表內的枚舉值應獨一無二。

建議。指針最好指向一個const類型的變量。

必需。不得使用restrict限定詞。

1. 必需。類型應被顯式聲明

#include <stdio.h>int main() {a = 10; // 錯誤:變量a未顯式聲明printf("%d\n", a);return 0;
}

2. 必需。函數應以原型形式命名參數

#include <stdio.h>int add(); // 錯誤:函數原型未命名參數int main() {printf("%d\n", add(5, 3));return 0;
}int add(int a, int b) {return a + b;
}

3. 必需。所有對象和函數的聲明需要使用完全相同的名字和參數

#include <stdio.h>int func(int a); // 聲明
int func(float a); // 錯誤:函數聲明參數類型不一致int main() {printf("%d\n", func(5));return 0;
}int func(int a) {return a;
}

4. 必需。當定義有外部鏈接的對象或函數時,兼容聲明應是可見的

#include <stdio.h>int globalVar; // 聲明int main() {printf("%d\n", globalVar);return 0;
}// 錯誤:外部變量globalVar的定義不可見
// int globalVar = 10;

5. 必需。外部變量或函數應被在僅一個文件內被聲明過

// file1.c
int globalVar = 10;// file2.c
#include <stdio.h>int main() {printf("%d\n", globalVar);return 0;
}// 錯誤:globalVar在多個文件中定義
// int globalVar = 20;

6. 必需。有外部鏈接的標識符應有一個確切的外部定義

#include <stdio.h>int globalVar; // 聲明int main() {printf("%d\n", globalVar);return 0;
}// 錯誤:globalVar沒有外部定義

7. 建議。若函數和對象僅被一個單元引用,最好不定義外部鏈接

#include <stdio.h>int globalVar = 10; // 外部鏈接int main() {printf("%d\n", globalVar);return 0;
}// 建議:如果globalVar僅被main函數使用,應定義為靜態
// static int globalVar = 10;

8. 必需。靜態存儲類說明符應在所有具有內部鏈接的對象和函數的聲明中使用

#include <stdio.h>int func(); // 錯誤:函數聲明未使用靜態存儲類int main() {printf("%d\n", func());return 0;
}int func() {return 10;
}

9. 建議。如果一個對象的標識符僅在一個函數內出現,該對象應被定義在塊范圍內

#include <stdio.h>int globalVar = 10; // 全局變量int main() {printf("%d\n", globalVar);return 0;
}// 建議:如果globalVar僅被main函數使用,應定義為局部變量
// int main() {
//     int localVar = 10;
//     printf("%d\n", localVar);
//     return 0;
// }

10. 必需。內聯函數定義時應用靜態存儲類聲明

#include <stdio.h>inline int add(int a, int b) { // 錯誤:內聯函數未使用靜態存儲類return a + b;
}int main() {printf("%d\n", add(5, 3));return 0;
}

11. 建議。當有外部鏈接的數組被定義,應顯式指定其大小

#include <stdio.h>int globalArray[] = {1, 2, 3}; // 錯誤:外部鏈接數組未顯式指定大小int main() {printf("%d\n", globalArray[0]);return 0;
}

12. 必需。枚舉列表內的枚舉值應獨一無二

#include <stdio.h>enum Colors {RED,GREEN,BLUE,RED // 錯誤:枚舉值RED重復
};int main() {return 0;
}

13. 建議。指針最好指向一個const類型的變量

#include <stdio.h>int main() {int a = 10;int *ptr = &a; // 錯誤:指針未指向const類型變量printf("%d\n", *ptr);return 0;
}

14. 必需。不得使用restrict限定詞

#include <stdio.h>void func(int * restrict a, int * restrict b) { // 錯誤:使用了restrict限定詞*a = 10;*b = 20;
}int main() {int x, y;func(&x, &y);printf("%d %d\n", x, y);return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/89459.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/89459.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/89459.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【blender】使用Vscode進行blender調試

配置vscodeblender 直接使用blender中的text editor沒有代碼補全&#xff0c;終端輸出通常和blender不在同一個頁面&#xff0c;只適合非常簡單的代碼測試。使用Vscode能有效提高blender調試的效率&#xff0c;具體方式見&#xff1a;VSCode 開發 Blender腳本工具配置。 調試…

Au速成班-樂理知識補充+網頁下載音樂

音質分類 通過查看音頻頻譜&#xff0c;128Kbps、192Kbps、320Kbps、無損&#xff08;Lossless HD&#xff09;CD音質&#xff08;頻率都在20kHz以上&#xff09;。 各家平臺對無損的定義不一樣&#xff0c;em各有說法吧。 無損的含義是&#xff1a;無損失的聲音格式。只要能…

JAVA中的Collection集合及ArrayList,LinkedLIst,HashSet,TreeSet和其它實現類的常用方法

文章目錄前言一、Collection 接口常用方法1.boolean add(E e)2.boolean remove(Object o)3.boolean contains(Object o)4.boolean isEmpty()5.int size()6.void clear()7.Object[] toArray()8.boolean containsAll(Collection<?> c)9.boolean addAll(Collection<? e…

有n棍棍子,棍子i的長度為ai,想要從中選出3根棍子組成周長盡可能長的三角形。請輸出最大的周長,若無法組成三角形則輸出0。

題目描述&#xff1a; 有n棍棍子&#xff0c;棍子i的長度為ai&#xff0c;想要從中選出3根棍子組成周長盡可能長的三角形。請輸出最大的周長&#xff0c;若無法組成三角形則輸出0。 算法為O(nlogn) 初始理解題目 首先&#xff0c;我們需要清楚地理解題目要求&#xff1a; 輸入…

【Echarts】 電影票房匯總實時數據橫向柱狀圖比圖

效果圖code <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>圓角柱狀圖</title><script src"https://cdn.jsdelivr.net/npm/echarts5.4.3/dist/echarts.min.js"></script> </head> <…

【深度學習基礎】PyTorch中model.eval()與with torch.no_grad()以及detach的區別與聯系?

目錄1. 核心功能對比2. 使用場景對比3. 區別與聯系4. 典型代碼示例(1) 模型評估階段(2) GAN 訓練中的判別器更新(3) 提取中間特征5. 關鍵區別總結6. 常見問題與解決方案(1) 問題&#xff1a;推理階段顯存爆掉(2) 問題&#xff1a;Dropout/BatchNorm 行為異常(3) 問題&#xff1…

博客摘錄「 華為云平臺-FusionSphere OpenStack 8.2.1 系統加固」2025年7月15日

編號 加固項 "風險 等級" 加固原理/Rationale 審計方法/Audit 期望結果/Expect Results 加固方法/Remediation 1 OpenSSH加固配置 1.1 OpenSSH加固配置 1.1.1 SSH使用的版本 H "Op…

永磁同步電機MTPA與MTPV曲線具體仿真實現

永磁同步電機MTPA與MTPV曲線具體仿真實現 近期做了一些標定試驗&#xff0c;實際電機參數并不是確定的&#xff0c;而是變化的&#xff0c;因此很難通過解析的方法算出MTPA的對應點&#xff0c;以及在弱磁區如何過度到MTPV。這個在實際情況下都是一點點標出來的&#xff0c;我這…

Adobe Acrobat 插件功能、應用與開發

什么是 Acrobat 插件&#xff1f; Adobe Acrobat 插件是一種能夠擴展 Adobe Acrobat 閱讀器/查看器功能的軟件組件。Acrobat 是用于查看、創建和編輯 PDF 文檔的流行程序&#xff0c;而插件可以為其添加新功能&#xff0c;例如&#xff1a; #mermaid-svg-iqdM1wLkFQhd3ilQ {fon…

Redis學習系列之——高并發應用的緩存問題(二)

一、布隆過濾器布隆過濾器由一個 BitMap 和若干 Hash 函數組成&#xff0c;可以用來快速判斷一個值是否存在后端存儲中。它是解決 Redis 緩存穿透問題的一個不錯的解決方案。工作原理步驟1&#xff1a;當 key-value 鍵值對存儲到 Redis 后&#xff0c;向布隆過濾器添加 key步驟…

Expression 類的靜態方法

public static MethodCallExpression Call(Type type, // 包含目標方法的類型string methodName, // 方法名稱Type[]? typeArguments, // 泛型方法的類型參數&#xff08;非泛型方法為 null&#xff09;params Expression[]? arguments // 方…

[Nagios Core] 事件調度 | 檢查執行 | 插件與進程

第五章&#xff1a;事件調度 歡迎回到Nagios Core&#xff01; 在上一章第四章&#xff1a;配置加載中&#xff0c;我們了解了Nagios如何讀取配置文件以知曉需要監控的對象&#xff0c;比如我們的朋友"Web Server 1"。此時Nagios內存中已構建完整的基礎設施拓撲圖。…

Web3 常用前端庫介紹

一、Web3 前端開發&#xff1a;連接用戶與區塊鏈的橋梁 隨著 Web3 生態的蓬勃發展&#xff0c;前端開發從傳統的頁面渲染進化為區塊鏈交互的核心樞紐。Web3 前端庫作為連接用戶與區塊鏈的橋梁&#xff0c;承擔著錢包集成、合約交互、數據可視化等關鍵功能。本文將系統解析主流 …

cnpm命令報internal/modules/cjs/loader.js:797 throw err; ^ Error: Cannot find

在運行一個項目的時候&#xff0c;需要升級電腦各組件的版本&#xff0c;結果導致cnpm命令無法正常使用&#xff0c;cnpm任何命令都會報如下這個錯&#xff1a;找了半天&#xff0c;發現是由于cnpm與npm的版本不一致導致的&#xff0c;所以需要卸載并重新安裝cnpm&#xff0c;重…

15、鴻蒙Harmony Next開發:創建自定義組件

目錄 自定義組件的基本用法 自定義組件的基本結構 struct Component freezeWhenInactive build()函數 Entry EntryOptions Reusable 成員函數/變量 自定義組件的參數規定 build()函數 自定義組件生命周期 自定義組件的創建和渲染流程 自定義組件重新渲染 自定義…

深入理解Map.Entry.comparingByValue()和Map.Entry.comparingByKey()

文章目錄深入理解Map.Entry.comparingByValue()和Map.Entry.comparingByKey()1. 方法定義comparingByKey()comparingByValue()2. 基本用法2.1 使用comparingByKey()2.2 使用comparingByValue()3. 方法重載版本comparingByKey(Comparator)comparingByValue(Comparator)4. 高級用…

Mac下載mysql

安裝 brew list --versions | grep mysql查看已安裝的mysql版本brew search mysql查看支持的mysql版本brew info mysql查看mysql版本信息brew install mysql進行安裝/opt/homebrew/opt/mysql/bin/mysqld --initialize-insecure --user$(whoami) --basedir$(brew --prefix mysql…

PageHelper使用說明文檔

文章目錄一、簡介二、集成步驟三、使用方法四、注意事項五、高級用法一、簡介 PageHelper 是一個開源的 MyBatis 分頁插件&#xff0c;它可以幫助我們在使用 MyBatis 進行數據庫操作時方便地實現分頁功能。通過簡單的配置和少量的代碼修改&#xff0c;就可以在查詢數據時實現分…

grpo nl2sql qwen3 模型強化學習訓練有效果的成立條件有哪些

在使用GRPO&#xff08;強化學習算法&#xff09;對Qwen3模型在NL2SQL&#xff08;自然語言到SQL轉換&#xff09;任務上進行強化學習&#xff08;RL&#xff09;訓練時&#xff0c;其效果成立的核心條件可歸納為以下幾個關鍵維度&#xff0c;這些條件相互關聯&#xff0c;共同…

面向向量檢索的教育QA建模:九段日本文化研究所日本語學院的Prompt策略分析(6 / 500)

面向向量檢索的教育QA建模&#xff1a;九段日本文化研究所日本語學院的Prompt策略分析&#xff08;6 / 500&#xff09; 系列說明 500 所日本語言學校結構化建模實戰&#xff0c;第 6 篇。每篇拆解 1 所學校在 Prompt-QA 系統中的建模策略&#xff0c;分享工程經驗&#xff0c;…