首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

高品質 C++/C 程式設計指南 第 8 章 (一):函數重載機制、實現原理與 extern "C" 混合編程

     編輯:關於C++

8.1 函數重載:從自然語言到 C++ 機制

起源

  • 自然語言一詞多義 (如「吃飯」涵蓋吃牛肉/魚/雞),靠上下文消歧。
  • C++ 引入重載:**語義相近函數共用名稱,參數區分**,提升易用性與記憶友善度。
  • **關鍵動機**:建構函數**必須同名** (與類別同名),若需多種建構方式,**非重載莫屬**。

實現原理:Name Mangling (名字修飾)

編譯器依參數型別/順序生成內部唯一標識符:

void Eat(Beef&);    // → _Eat_Beef
void Eat(Fish&);    // → _Eat_Fish
void Eat(Chicken&); // → _Eat_Chicken

**返回型別不參與區分** —— 忽略返回值的調用將導致二義性。

混合編程:C++ 呼叫 C 函數庫

問題

  • C 編譯器符號:_foo
  • C++ 編譯器符號 (支援重載/型別安全連結):_foo_int_int
  • 符號不匹配 → 連結失敗。

解法:extern "C" 連結規範

extern "C" {
    void foo(int x, int y); // 告訴 C++ 編譯器:用 C 連結,符號為 _foo
    // 或批量引入 C 標頭
    #include "my_c_header.h"
}

標準庫頭檔已內建 extern "C",故可直接 #include <cstdio> 等。

重載誤區澄清

  • 全域函數 vs 成員函數同名 ≠ 重載** (作用域不同)。
  • 類別成員呼叫同名全域函數需加 :: 前綴:::Print();。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved