[英]can static declared global variable can be accessed with extern in another file?
[英]How can an extern pointer to string literal declared in one C file be accessed in another C file?
我正在使用C語言,而且我需要一個字符串文字,它可以在一個.c
文件的main
函數中發現,以便可以在一個完全不同的.c
文件中進行訪問。
我已經嘗試的方法:我在標頭中將指向字符串文字的指針聲明為extern
,在一個.c
文件中定義了它,並嘗試在第二個.c
文件中訪問文字。 由於第二個(正在訪問)文件中的定義不足,編譯失敗。
簡而言之:
file1.h :
extern char *global;
file1.c :
#include "file1.h"
int main() {
//some code
extern char *global = some_struct->data;
//more code
}
file2.c :
#include "file1.h"
int do_stuff() {
//some code
some_function(global);
//more code
}
我希望可以編譯該文件,因為global
在file1.h
聲明,在file1.c
定義,並且其值在file2.c
訪問。 但是,對於未定義的變量, file2.c
編譯失敗。
如果相關, file1.c
的main
函數始終是程序中運行的第一個函數。
在主要
extern char *global = some_struct->data;
是錯誤的,如果要分配全局 do:
global = some_struct->data;
還有一些需要在全局范圍內定義global的地方 :
char *global;
因此例如main變為:
#include "file1.h"
char *global;
int main() {
//some code
global = some_struct->data;
//more code
}
您已經接近,但還沒到那兒。 全局變量也必須在全局范圍內定義 ,並且您會遇到聲明和定義之間的差異(很容易以錯誤的方式繞過,但這些單詞與想法無關緊要)。 通常,引入變量的語句將同時聲明和定義,但對於在模塊之間共享的全局變量則不是這樣:
在file1.h
,您正確地在全局范圍內聲明了char*
變量。 包含此文件的任何人(例如file2.c
)都會“看到”具有該名稱的變量,並且所有模塊都將進行干凈地編譯,並且extern
關鍵字明確表明您僅聲明它存在,而不為其創建存儲。然而。 那就是您想要的,因為您不想意外地使用此名稱創建多個沖突的全局變量。 當最終將編譯的模塊鏈接在一起時,鏈接器將查找為全局預留的實際內存存儲空間,並正確連接所有引用。
但是在您的情況下,這將不會正確發生,因為盡管您已經向世界宣布此全局存在,但您尚未實際為變量創建存儲!
您仍然需要在file1.h
的全局范圍(功能之外)中file1.h
:
char * global;
這將創建具有與extern聲明匹配的名稱的實際變量,因此鏈接器將能夠正確地組裝模塊。
所以
#include "file1.h"
// Define global:
char * global;
int main() {
// Assign a value to the global variable:
global = some_struct->data;
//more code
}
請注意,您不會在該文件中重新聲明extern或其他任何內容,也不會重新定義main
內部的global
的類型,因為它已經存在,您可以為其分配值或查看其值。 您在這里也不要使用關鍵字extern
它是此變量的“ home”模塊。
聲明和定義通常是同時完成的,例如,在函數中聲明局部變量時。 可從不同模塊訪問的全局變量依賴於將工作分成兩個單獨的想法,以使同事,編譯器和鏈接器工具鏈都不會因您的意圖而混淆。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.