2010-01-10 167 views
3

我想一個全局變量在C握着我的錯誤信息全局變量,C

一個庫名爲utils的有:

#ifndef private_error_h 
#define private_error_h 

extern char error[1024]; 

__declspec(dllexport) void FillError(char* newError); 
#define GetErr() error 

#endif 

文件error.c:

#include "private_error.h" 

char error[1024]; 
void FillError(char* newError) { 
    // ... 
} 

然後我嘗試在程序中使用它:

#include "private_error.h" 

int main() { 
    FillError("General error"); 
    printf("%s\n", GetErr()); 
    return 0; 
} 

它使用不同的地址創建兩個變量。我如何讓程序使用Utils庫中的變量?

我確實設法通過將GetErr更改爲返回字符串的函數來繞過此問題,但我仍然想知道錯誤在哪裏。

回答

3

你必須在你的頭文件中聲明它爲

extern char error [];

並在代碼文件(.c文件),其聲明

炭錯誤[1024];

你兩次分配它

+0

第二,沒有外部,是一個定義。 – 2010-01-10 21:36:31

+0

試過了,庫無法識別數組。 錯誤LNK2001:無法解析的外部符號_HError – Hagai 2010-01-10 21:55:16

+0

您的DLL文件可能存在特殊問題,因爲您在提問中提示的是您的目標。 – 2010-01-10 21:56:55

-1

爲什麼不使用功能是這樣的:

在.H:

char* GetErr(); 

和的.cpp:

char* GetErr() { return error; } 

儘量避免全局變量。在文件範圍內它非常安全,但是如果您嘗試通過很多文件使用它,它可能會導致嚴重錯誤。

+0

全局數組有什麼問題?如果許多文件使用它,如何讓「get」函數防止「大錯誤」?他們仍然可以訪問陣列。 – Pod 2010-01-10 20:46:59

+0

他們有,如果他們明確宣佈使用它。你避免例如名稱錯誤,而'錯誤'是變量的流行名稱:P隱藏實現總是一個好習慣。 – qba 2010-01-10 21:21:03

+0

這就是我爲了不被卡住而做的。但我仍然想知道如何定義一個全局數組... – Hagai 2010-01-10 21:47:01