嵌入式軟件開發常見warning之 warning: implicit declaration of function

文章目錄

    • 🧩 1. C 編譯流程回顧(背景)
    • 📍 2. 出現 warning 的具體階段:**編譯階段(Compilation)**
      • 🧬 2.1 詞法分析(Lexical Analysis)
      • 🌲 2.2 語法分析(Syntax Analysis)
      • 🧠 2.3 語義分析(Semantic Analysis)——**問題關鍵**
      • ?? 所以它認為你是在“**隱式聲明函數**”。
        • 它做了如下假設(C89 兼容方式):
    • 💣 3. 隱式聲明的深層隱患(符號層面)
      • 🔧 3.1 類型系統缺失
      • 🔧 3.2 匯編生成錯誤
      • 🔧 3.3 鏈接錯誤或運行崩潰
    • 🧪 4. 舉個“壞例子”:你以為的 vs 實際的
    • ? 5. 編譯器如何防范?
    • ? 6. 正確行為:從語義到鏈接
    • ? 總結(知識點歸納)


我們來從編譯原理的視角更深入地解析這個 warning:implicit declaration of function 'sleep_us'


🧩 1. C 編譯流程回顧(背景)

C 語言編譯大致分為以下幾個階段:

  1. 預處理(Preprocessing)

    • 處理 #include, #define, #if 等。
    • 把頭文件文本插入到源文件。
  2. 編譯(Compilation)

    • 將預處理后的代碼翻譯為匯編代碼。
    • 語法分析、語義分析、符號解析等都在此階段進行。
  3. 匯編(Assembly)

    • 將匯編代碼翻譯為目標機器碼(.o 文件)。
  4. 鏈接(Linking)

    • 將多個目標文件合并,并解析外部符號引用(如函數地址)。

📍 2. 出現 warning 的具體階段:編譯階段(Compilation)

當編譯器處理你這句代碼:

sleep_us(period);

時,它執行了如下步驟:

🧬 2.1 詞法分析(Lexical Analysis)

將代碼分解為 Token:

Identifier: sleep_us
Punctuation: (
Identifier: period
Punctuation: )

詞法是沒問題的。


🌲 2.2 語法分析(Syntax Analysis)

構建抽象語法樹(AST)。調用語句的語法結構沒問題。


🧠 2.3 語義分析(Semantic Analysis)——問題關鍵

這一步,編譯器嘗試做函數符號解析:

“這個 sleep_us 是誰?我有沒有見過它的函數聲明?”

此時,它查找當前作用域中所有的標識符(symbol table):

  • 沒有頭文件中定義 sleep_us 的聲明。
  • 沒有在前文定義這個函數。
  • 沒有 extern 聲明。

?? 所以它認為你是在“隱式聲明函數”。

它做了如下假設(C89 兼容方式):
int sleep_us();  // 這是默認推導出來的

即:返回 int,參數類型不檢查!

這就是 implicit declaration 的本質。


💣 3. 隱式聲明的深層隱患(符號層面)

🔧 3.1 類型系統缺失

編譯器根本不知道 sleep_us(uint64_t) 的真正參數類型。你傳個 float 進去也不會警告。

sleep_us(3.14);  // 編譯器不報錯,你以為能用

運行時可能造成未定義行為。


🔧 3.2 匯編生成錯誤

因為函數返回類型錯誤、調用約定不符,編譯器可能:

  • 為返回值預留了錯誤的寄存器
  • 沒有生成必要的參數壓棧/寄存器傳遞代碼
  • 導致調用協議(Calling Convention)錯誤

🔧 3.3 鏈接錯誤或運行崩潰

雖然鏈接器可能能找到真正的函數地址并綁定 sleep_us,但:

  • 如果參數傳遞方式錯了(比如寄存器不一致),運行時會崩
  • 如果函數體被裁掉了(因為鏈接器以為沒人用),也會出錯

🧪 4. 舉個“壞例子”:你以為的 vs 實際的

// 你以為這樣寫了
void sleep_us(uint64_t us);// 實際編譯器看到的是
int sleep_us();  // 參數列表未知sleep_us(100000);  // 你傳了一個64位整數,結果它只處理了32位或沒處理

在某些架構上(如 ARM Cortex-M),這可能會導致:

  • 參數沒傳對(寄存器錯位)
  • 棧溢出或指令異常
  • 異常 hardfault

? 5. 編譯器如何防范?

現代 C 編譯器(遵循 C99/C11)通常會:

  • 默認禁止隱式聲明(有些是 warning,有些是 error)
  • 必須在調用函數前顯式包含頭文件

? 6. 正確行為:從語義到鏈接

正確流程如下:

  1. 你寫 #include "pico/stdlib.h"
  2. 預處理階段插入頭文件,函數聲明進入符號表
  3. 編譯器知道 sleep_us 返回 void,參數為 uint64_t
  4. 編譯器檢查參數類型,生成正確指令
  5. 匯編生成正確符號引用
  6. 鏈接時綁定到目標文件或庫中的 sleep_us 實現
  7. 運行時穩定可靠

? 總結(知識點歸納)

階段解釋
編譯語義分析無函數聲明時,編譯器隱式假設 int function(),不檢查參數
匯編生成可能生成錯誤的參數壓棧/寄存器調用代碼
鏈接階段可能綁定錯誤、符號沖突
運行時崩潰、數據錯亂、異常行為
正解包含聲明頭文件,明確函數簽名,遵循 C99 及以上標準

如你需要,我可以再給你配一張編譯器處理函數調用和符號解析流程的圖,是否需要?

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

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

相關文章

【人工智能-agent】--Dify中MCP工具存數據到MySQL

本文記錄的工作如下: 自定義MCP工具,爬取我的鋼鐵網數據爬取的數據插值處理自定義MCP工具,把爬取到的數據(str)存入本地excel表格中自定義MCP工具,把爬取到的數據(str)存入本地MySQ…

Golang 應用的 CI/CD 與 K8S 自動化部署全流程指南

一、CI/CD 流程設計與工具選擇 1. 技術棧選擇 版本控制:Git(推薦 GitHub/GitLab)CI 工具:Jenkins/GitLab CI/GitHub Actions(本文以 GitHub Actions 為例)容器化:Docker Docker Compose制品庫…

網絡基礎1(應用層、傳輸層)

目錄 一、應用層 1.1 序列化和反序列化 1.2 HTTP協議 1.2.1 URL 1.2.2 HTTP協議格式 1.2.3 HTTP服務器示例 二、傳輸層 2.1 端口號 2.1.1 netstat 2.1.2 pidof 2.2 UDP協議 2.2.1 UDP的特點 2.2.2 基于UDP的應用層…

基于大模型預測的吉蘭 - 巴雷綜合征綜合診療方案研究報告大綱

目錄 一、引言(一)研究背景(二)研究目的與意義二、大模型預測吉蘭 - 巴雷綜合征的理論基礎與技術架構(一)大模型原理概述(二)技術架構設計三、術前預測與手術方案制定(一)術前預測內容(二)手術方案制定依據與策略四、術中監測與麻醉方案調整(一)術中監測指標與數…

【言語】刷題2

front:刷題1 ? 前對策的說理類 題干 新時代是轉型關口,要創新和開放(前對策)創新和開放不能一蹴而就,但是對于現代化很重要 BC片面,排除 A雖然表達出了創新和開放很重要,體現了現代化&#xf…

Blueprints - Gameplay Message Subsystem

一些學習筆記歸檔; Gameplay Message是C插件,安裝方式是把插件文件夾拷貝到Plugins中(沒有的話需要新建該文件夾),然后再刷新源碼,運行項目; 安裝后還需要在插件中激活: 這樣&#…

火山云網站搭建

使用火山引擎的 **火山云(Volcano Engine Cloud)** 搭建網站,主要涉及云服務器、存儲、網絡等核心云服務的配置。以下是搭建網站的基本步驟和關鍵點: --- ### **一、準備工作** 1. **注冊火山引擎賬號** - 訪問火山引擎官網&…

嵌入式開發學習(第二階段 C語言基礎)

直到型循環的實現 特點:先執行,后判斷,不管條件是否滿足,至少執行一次。 **代表:**do…while,goto(已經淘汰,不推薦使用) do…while 語法: 循環變量; do {循環體; }…

Nginx +Nginx-http-flv-module 推流拉流

這兩天為了利用云服務器實現 Nginx 進行OBS Rtmp推流,Flv拉流時發生了諸多情況,記錄實現過程。 環境 OS:阿里云CentOS 7.9 64位Nginx:nginx-1.28.0Nginx-http-flv-module:nginx-http-flv-module-1.2.12 安裝Nginx編…

射頻ADRV9026驅動

參考: ADRV9026 & ADRV9029 Prototyping Platform User Guide [Analog Devices Wiki] 基于ADRV9026的四通道射頻收發FMC子卡-CSDN博客 adrv9026 spi 接口驗證代碼-CSDN博客

使用本地部署的 LLaMA 3 模型進行中文對話生成

以下程序調用本地部署的 LLaMA3 模型進行多輪對話生成,通過 Hugging Face Transformers API 加載、預處理、生成并輸出最終回答。 程序用的是 Chat 模型格式(如 LLaMA3 Instruct 模型),遵循 ChatML 模板,并使用 apply…

Oracle19c中的全局臨時表

應用程序通常使用某種形式的臨時數據存儲來處理過于復雜而無法一次性完成的流程。通常,這些臨時存儲被定義為數據庫表或 PL/SQL 表。從 Oracle 8i 開始,可以使用全局臨時表將臨時表的維護和管理委托給服務器。 一、臨時表分類 Oracle 支持兩種類型的臨…

Windows 安裝 Milvus

說明 操作系統:Window 中間件:docker desktop Milvus:Milvus Standalone(單機版) 安裝 docker desktop 參考:Window、CentOs、Ubuntu 安裝 docker-CSDN博客 安裝 Milvus 參考鏈接:Run Mil…

24、DeepSeek-V3論文筆記

DeepSeek-V3論文筆記 **一、概述****二、核心架構與創新技術**0.匯總:1. **基礎架構**2. **創新策略** 1.DeepSeekMoE無輔助損失負載均衡DeepSeekMoE基礎架構無輔助損失負載均衡互補序列級輔助損失 2.多令牌預測(MTP)1.概念2、原理2.1BPD2.2M…

1.8 梯度

(知識體系演進邏輯樹) 一元導數(1.5) │ ├─→ 多元偏導數(1.6核心突破) │ │ │ └─解決:多變量耦合時的單變量影響分析 │ │ │ ├─幾何:坐標軸切片切線斜率…

274、H指數

題目 給你一個整數數組 citations ,其中 citations[i] 表示研究者的第 i 篇論文被引用的次數。計算并返回該研究者的 h 指數。 根據維基百科上 h 指數的定義:h 代表“高引用次數” ,一名科研人員的 h 指數 是指他(她&#xff09…

【C++11】異常

前言 上文我們學習到了C11中類的新功能【C11】類的新功能-CSDN博客 本文我們來學習C下一個新語法:異常 1.異常的概念 異常的處理機制允許程序在運行時就出現的問題進行相應的處理。異常可以使得我們將問題的發現和問題的解決分開,程序的一部分負…

Linux基礎命令之目錄管理——了解各種操作文件目錄的命令,萬字教學,超詳細!!!(1)

文章目錄 前言1、Linux文件系統1.1 核心特點1.2 重要目錄結構1.3 文件類型1.4 文件和目錄的命名規則1.5 文件與目錄的定位方式 2、查看目錄或文件的詳細信息(ls)2.1 基本語法2.2 常用操作2.3 高級用法 3、切換目錄(cd)3.1 常用操作…

在線caj轉換word

CAJ格式是中國知網特有的一種文獻格式,在學術研究等領域廣泛使用,但有時我們需要將其轉換為Word格式,方便編輯、引用文獻。本文分享如何輕松將CAJ轉換為word的轉換工具,提高閱讀和辦公效率。 如何將CAJ轉換WORD? 1、使用CAJ轉換…

【現代深度學習技術】注意力機制05:多頭注意力

【作者主頁】Francek Chen 【專欄介紹】 ? ? ?PyTorch深度學習 ? ? ? 深度學習 (DL, Deep Learning) 特指基于深層神經網絡模型和方法的機器學習。它是在統計機器學習、人工神經網絡等算法模型基礎上,結合當代大數據和大算力的發展而發展出來的。深度學習最重…