簡體   English   中英

如何在另一個C文件中訪問指向在一個C文件中聲明的字符串文字的外部指針?

[英]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
}

我希望可以編譯該文件,因為globalfile1.h聲明,在file1.c定義,並且其值在file2.c訪問。 但是,對於未定義的變量, file2.c編譯失敗。

如果相關, file1.cmain函數始終是程序中運行的第一個函數。

主要

  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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM