c++ extern 關鍵字

C++中的extern關鍵字和跨語言互操作

變量的聲明與定義

extern關鍵字用于聲明在另一個翻譯單元(文件)中定義的變量或函數。通過extern關鍵字,可以在多個文件中訪問全局變量或函數。

變量聲明示例

文件:main.cpp

#include <iostream>// 聲明外部變量
extern int globalVariable;int main() {std::cout << "全局變量: " << globalVariable << std::endl;return 0;
}

文件:global.cpp

// 定義外部變量
int globalVariable = 42;

函數聲明示例

文件:main.cpp

#include <iostream>// 聲明外部函數
extern void printMessage();int main() {printMessage();return 0;
}

文件:functions.cpp

#include <iostream>// 定義外部函數
void printMessage() {std::cout << "來自另一個文件的消息!" << std::endl;
}
編譯

要編譯并鏈接這些文件,可以使用如下命令:

g++ main.cpp global.cpp functions.cpp -o myProgram

extern "C" 來與 C 代碼進行互操作

extern "C"關鍵字在 C++ 中用于指示編譯器以 C 語言的方式來處理聲明的函數或變量,從而實現 C 和 C++ 代碼的互操作。

C 代碼部分

文件:example.c

#include <stdio.h>// 這是一個 C 函數
void hello_from_c() {printf("Hello from C!\n");
}// 這是一個接受兩個整數并返回它們和的 C 函數
int add(int a, int b) {return a + b;
}

C++ 代碼部分

文件:main.cpp

#include <iostream>// 使用 extern "C" 來聲明 C 函數
extern "C" {void hello_from_c();int add(int a, int b);
}int main() {// 調用 C 函數hello_from_c();// 調用 C 的加法函數int result = add(3, 4);std::cout << "The result of add(3, 4) is: " << result << std::endl;return 0;
}
編譯和運行

要編譯和運行這個程序,需要執行以下步驟:

  1. 首先編譯 C 文件:

    gcc -c example.c -o example.o
    
  2. 然后編譯 C++ 文件并鏈接 C 文件:

    g++ main.cpp example.o -o main
    
  3. 最后運行生成的可執行文件:

    ./main
    

執行后,應該會看到以下輸出:

Hello from C!
The result of add(3, 4) is: 7

與 C 代碼共享全局變量

C++ 代碼可以訪問 C 代碼中定義的全局變量,反之亦然。

C 代碼

文件:example.c

int shared_variable = 10;void print_shared_variable() {printf("Shared variable: %d\n", shared_variable);
}

C++ 代碼

文件:main.cpp

#include <iostream>extern "C" {extern int shared_variable;void print_shared_variable();
}int main() {std::cout << "Shared variable in C++: " << shared_variable << std::endl;print_shared_variable();return 0;
}

與 C 庫的互操作

通過extern "C",可以在 C++ 中使用用 C 編寫的庫。

C 庫頭文件

文件:mylib.h

#ifndef MYLIB_H
#define MYLIB_Hvoid c_function();#endif

C 庫實現

文件:mylib.c

#include "mylib.h"
#include <stdio.h>void c_function() {printf("Function from C library\n");
}

C++ 代碼

文件:main.cpp

#include <iostream>extern "C" {#include "mylib.h"
}int main() {c_function();return 0;
}

抑制編譯器對未使用參數的警告

為了避免編譯器對未使用參數發出警告,可以使用如下方法:

void func(int signal) {(void)signal; // 忽略未使用的參數warning
}

這一行是一種顯式標記signal參數為未使用的方式,從而抑制編譯器的警告。

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

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

相關文章

chatglm2-6b-prompt嘗試

參考https://cloud.tencent.com/developer/article/2426296 chatglm2-6b&#xff0c;通過prompt來實現zero-shot/fewshot的自然語言處理任務 import json import re import os from modelscope.utils.constant import Tasks from modelscope import Model from modelscope.pi…

再議擴散模型

目錄 一、基礎知識 1、數學期望 2、概率表示 3、KL散度 二、擴散過程 三、理想的去噪過程 四、真實的去噪過程 五、噪聲生成 導言 筆者早些時候曾粗略看過擴散模型的流程&#xff0c;但對于底層算法&#xff08;尤其是概率論方面&#xff09;&#xff0c;理解不夠透徹…

pytorch學習(五)tensorboard使用

1. 創建環境 首先創建一個環境: conda create -n pytorch conda activate pytorch 然后安裝tensorboard pip install tensorboard 安裝opencv pip install opencv-python 2. 簡單的案例 標量和圖像的顯示&#xff1a; 2.1標量實現的方法是add_scalar,第一個參數是給顯…

探索Puppeteer的強大功能:抓取隱藏內容

背景/引言 在現代網頁設計中&#xff0c;動態內容和隱藏元素的使用越來越普遍&#xff0c;這些內容往往只有在特定的用戶交互或條件下才會顯示出來。為了有效地獲取這些隱藏內容&#xff0c;傳統的靜態爬蟲技術往往力不從心。Puppeteer&#xff0c;作為一個強大的無頭瀏覽器工…

印尼語翻譯通:AI驅動的智能翻譯與語言學習助手

在這個多元文化交織的世界中&#xff0c;語言是連接我們的橋梁。印尼語翻譯通&#xff0c;一款專為打破語言障礙而生的智能翻譯軟件&#xff0c;讓您與印尼語的世界輕松接軌。無論是商務出差、學術研究&#xff0c;還是探索印尼豐富的文化遺產&#xff0c;印尼語翻譯通都是您的…

代碼隨想錄算法訓練營第三十六天|1049. 最后一塊石頭的重量 II 、 494. 目標和 、 474.一和零

1049. 最后一塊石頭的重量 II 分成兩堆石頭&#xff0c;一堆石頭的總重量是dp[target]&#xff0c;另一堆就是sum - dp[target]。 在計算target的時候&#xff0c;target sum / 2 因為是向下取整&#xff0c;所以sum - dp[target] 一定是大于等于dp[target]的。 那么相撞之…

.NET C# 使用 iText 生成PDF

.NET C# 使用 iText 生成PDF 文章目錄 .NET C# 使用 iText 生成PDF1 安裝 iText 7 庫&#xff1a;2 變量定義3 創建一個PDF4 段落5 旋轉文本6 代碼塊7 外部鏈接8 內部鏈接9 表格10 注釋11 線條12 二維碼13 嵌入圖像14 列表15 設置背景16 頁眉17 頁腳18 事件19 水印20 分欄21 源…

老古董Lisp(1):粗魯先生Lisp再出發

粗魯先生Lisp再出發 開始的原因 目標和夢想是最近考慮的一個問題。什么是目標&#xff1f;什么是夢想&#xff1f;夢想可以激勵改變&#xff0c;目標才能實現改變。 開始這個部分的時候&#xff0c;我的夢想是什么&#xff1f;我的目標是什么&#xff1f;我想要什么&#xf…

libwebrtc.a+exosip連接fS 環境部署tips

//運行FS服務器 sudo ./freeswitch -nc -nonat //公網sudo ./freeswitch //運行客戶端 sudo ./fs_cli //加載模塊 load mod_av load mod_verto0.Invite交互過程 1.fs碼率設置 2.用戶密碼改動 3.數字簽名的摘要 4.FS收不到ACK 5.公網部署 6.查看frewswitch都占用哪些端口 7.日志…

Java(二十一)---棧的使用和模擬實現

文章目錄 前言1.什么是棧(Stack)?2. 棧的模擬實現3.stack的使用![在這里插入圖片描述](https://i-blog.csdnimg.cn/direct/80c82d22f3ee49cfaa2915d1c961573e.png)4.關于棧的oj題4.1.有效的括號4.2.逆波蘭表達式4.3.棧的壓入、彈出序列4.4.最小棧 前言 前面幾篇我們學習了順序…

Vue--Router(路由)

目錄 一 Router(路由) 1.作用 2.實現步驟 3.注意 一 Router(路由) 1.作用 Router又叫做路由&#xff0c;簡單來說&#xff0c;就是用來實現vue的頁面之間跳轉的。 我們都知道&#xff0c;使用vue必然會涉及到很多個組件&#xff0c;也就是頁面&#xff0c;而頁面之間肯定需…

RK3588讀取不到顯示器edid

問題描述 3588HDMIout接老的顯示器或者HDMI轉DVI接DVI顯示器顯示不了或者顯示內容是彩色條紋,但是這種顯示器測試過如果接筆記本或者主機是可以直接顯示的。這一類問題是HDMI下的i2c與顯示器通訊沒成功,讀取不到設備的edid。問題包括全志的H3 、AML的S905都有遇到 測試環境…

Qt-事件與信號

事件和信號的區別在于&#xff0c;事件通常是由窗口系統或應用程序產生的&#xff0c;信號則是Qt定義或用戶自定義的。Qt為界面組件定義的信號往往通常是對事件的封裝&#xff0c;如QPushButton的clicked()信號可以看做對QEvent::MouseButtonRelease類事件的封裝。 在使用界面組…

【QGroundControl二次開發】二.使用QT編譯QGC(Windows)

【QGroundControl二次開發】一.開發環境準備&#xff08;Windows&#xff09; 二. 使用QT編譯QGC&#xff08;Windows&#xff09; 2.1 打開QT Creator&#xff0c;選擇打開項目&#xff0c;打開之前下載的QGC項目源碼。 編譯器選擇Desktop Qt 6.6.3 MSVC2019 64bit。 點擊運…

vue3-tree-org實現帶照片的組織架構圖

官方文檔&#xff1a;vue3-tree-org 顯示照片需要注意的地方 使用步驟 下載 npm install vue3-tree-org --save 在main.js中引入 import "vue3-tree-org/lib/vue3-tree-org.css"; import vue3TreeOrg from vue3-tree-org;app.use(vue3TreeOrg) 實現代碼 <tem…

level 6 day2 網絡基礎2

1.socket&#xff08;三種套接字&#xff1a;認真看&#xff09; 套接字就是在這個應用空間和內核空間的一個接口&#xff0c;如下圖 原始套接字可以從應用層直接訪問到網絡層&#xff0c;跳過了傳輸層&#xff0c;比如在ubtan里面直接ping 一個ip地址,他沒有經過TCP或者UDP的數…

解決TypeError: __init__() takes 1 positional argument but 2 were given

問題描述&#xff1a; 如下圖&#xff0c;在使用torch.nn.Sigmoid非線性激活時報錯 源代碼&#xff1a; class testrelu(nn.Module):def __init__(self):super().__init__()self.sigmoid Sigmoid()def forward(self, input):output self.sigmoid(input)return outputwriter…

記錄貼-芋道源碼

環境搭建 文字講解 鏈接: 芋道源碼-環境搭建&#xff08;一&#xff09;后端 鏈接: 芋道源碼-環境搭建&#xff08;二&#xff09;前端 鏈接: 基于FastGPT和芋道源碼挑戰一句話生成代碼 視頻講解 鏈接: 芋道源碼零基礎啟動教程&#xff08;上&#xff09; 鏈接: 芋道源碼零基…

Blackbox AI:你的智能編程伙伴

目錄 Blackbox AI 產品介紹 Blackbox AI 產品使用教程 Blackbox AI體驗 AI問答 代碼驗證 實時搜索 探索&代理 拓展集成 總結 Blackbox AI 產品介紹 Blackbox是專門為程序員量身定制的語言大模型&#xff0c;它針對20多種編程語言進行了特別訓練和深度優化&#xff0c;在AI代…

React 從入門到實戰 一一開發環境基礎搭建(小白篇)

React 從入門到實戰一一開發環境基礎搭建&#xff08;小白篇&#xff09; React 介紹什么是 react &#xff1f;react 主要功能react 框架特點 開發工具渲染測試 React 介紹 最近兩年&#xff0c;react 也愈來愈火熱&#xff0c;想要在里面分一杯羹&#xff0c;那肯定逃不過 r…