编写代码c,编译gcc。 我在main.c和menu.c中使用全局数组,在main中没有预期的工作。但是在menu.c中工作得很好。有什么不同。
combo_strings.c中定义的全局数组TXT_STRINGS
#ifndef COMBO_STRINGS_C_
#define COMBO_STRINGS_C_
//array defined here
extern const unsigned char * TXT_STRINGS[50][3]={
{" KAPI SiFRESiNi GiRiN»","ENTER THE DOOR ACCESS PIN»"},
{"AYARLAR SiFRESi GiRiN» ","ENTER SETTINGS PASSWORD»"},
....
#endif /* COMBO_STRINGS_C_ */
//extern array declare
unsigned char * TXT_STRINGS[50][3];
function_x(){
trace_printf(TXT_STRINGS[1][0]); //printing console "AYARLAR SiFRESi GiRiN"
}
//extern array declare
unsigned char * TXT_STRINGS[50][3];
main(){
trace_printf("txt_str=%x",TXT_STRINGS[1][0]); //printing console "txt_str=20001f38"
}
答案 0 :(得分:2)
真的,创建 extern
范围变量的最佳位置
是一个头文件,按照惯例,它提供了对其他多个源文件的外部变量的可见性。
还有一点 ,在您的示例中,您定义了字符串文字的数组,其类型为char *,而不是unsigned char *,这会导致签名不匹配编译时,赋值语句出错。对于下面的示例,我将使用char *
...
以下示例说明了概念:
编辑 (更正的数据索引大小以匹配示例)
在some.h中
extern const char * TXT_STRINGS[5][2];//declare extern variable
然后在源 您的一个源文件 中定义extern
变量
in some.c
//define extern scoped variable in only 1 .c file
const char * TXT_STRINGS[5][2]={{"assdf","assdf"},
{"assdf","assdf"},
{"assdf","assdf"},
{"assdf","assdf"},
{"assdf","assdf"}};
在每个需要TXT_STRINGS
的可见性的源文件中:
<强> some.c 强>
#include“some.h”
<强> another.c 强>
#include“some.h”
<强> yetAnother.c 强>
#include“some.h”
答案 1 :(得分:0)
使用extern
关键字
extern unsigned char * TXT_STRINGS[LNG_ROWS_SIZE][LNG_CNT];
<{1}}和main.c
中的并将其从头文件中删除,以便不重新定义。
实际上,它已使用menu.c
重新定义和初始化,在这种情况下,相应的0
签名也是main()
。
另外,不要将定义放在头文件中,因为如果将它包含在源文件中,然后将文件链接在一起,那么多个定义错误将阻止编译。
答案 2 :(得分:0)
在您的代码中
const
是错误的概念。
你应该
//array defined here
extern
和menu.c
(menu.c
应该出现ar声明)TXT_STRINGS
移除extern
。 (combo_strings.c
将在此处定义)请记住,TXT_STRINGS
表示声明,而不是定义。如果您尝试使用extern
初始化变量(正如您在extern
中所做的那样),您的编译器应该发出警告。
也就是说,要打印combo_strings.c
,您需要使用TXT_STRINGS[VERSIYON][Dil]
格式说明符,例如
%s