1. C++ extern 的問題
extern 表示其後面接的變數或者函數"需要導出"或者"是一個外部的變數或函數"。
如果有頭文件已經聲明(採用函數或變數聲明的方式),可以無需該關鍵字
該關鍵字是告知編譯器,其後面的聲明函數或變數來自本文件的外部,最後鏈接的時候再定位。
經典的應用場景在動態庫導出或者外部變數引入。
下面是一個動態庫導出的示例:
extern"C"intdllfunc();//以C函數介面的方式導出函數dllfunc
這樣編譯器在編譯代碼的時候,就會保留dllfunc的名稱信息,方便其他模塊調用此函數
下面是一個外部變數引入的示例:
externintg_total;//g_total是一個外部的整型變數
這樣編譯器在編譯本代碼的時候,並不會立刻定位g_total的實體位置,而是推遲到link階段去解決實體位置問題。
對於函數引用聲明,使用extern和不使用,在語法角度上沒有本質區別。但是使用extern的函數,其名稱信息為保留在生成好的目標文件中,可以被任何第三方使用者看到。
因此,如果不是有意將其作為介面,請不要使用該關鍵字,以免影響模塊的安全性
對於變數,則必須要此關鍵字才能引用外部的變數,否則編譯器會在此文件內聲明一個同樣名稱的變數,並可能引發編譯錯誤(同一名稱空間中存在兩個相同名稱的變數)
2. c語言調用其他文件的函數怎麼編譯
調用函數庫的話用#include<XXX.h>或者#include"XXX.h"區別是你庫文件放在同一個文件夾還是在IDE的安裝目錄下面,如果你庫文件在你工程文件夾裡面用#include<XXX.h>,否則用#include"XXX.h"
如果你說自己寫庫的話是需要兩個宏命令,#ifndef_XXX_H#define_XXX_H,然後你函數名用extern表示
如果你說編譯的話,你應該說的是編譯原理吧,你可以反匯編一下一個編譯好的程序,如果該處編譯了一個其他函數庫的函數,你可以看到程序把參數PUSH到內存後CALL或者LCALL了一個這個函數的地址,這就完成了匯編中調用函數的部分,我記得X86裡面CALL的機器碼是E8H吧,有興趣的話可以自己用反匯編看一下
這個CALL的話就是調用函數的功能