定义全局变量,在 main 中得到不同的结果

defining global variabled, getting different results in main

写代码c,编译gcc。 我在 main.c 和 menu.c 中使用全局数组,主要没有预期的工作。但在 menu.c 中运行良好。有什么不同。

在combo_strings.c

中定义的全局数组TXT_STRINGS

combo_strings.c

#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_ */

menu.c

//extern array declare
unsigned char * TXT_STRINGS[50][3];

function_x(){
trace_printf(TXT_STRINGS[1][0]); //printing console "AYARLAR SiFRESi   GiRiN"

}

main.c

//extern array declare
unsigned char * TXT_STRINGS[50][3];

main(){
trace_printf("txt_str=%x",TXT_STRINGS[1][0]); //printing console "txt_str=20001f38"

}

使用extern关键字

extern unsigned char * TXT_STRINGS[LNG_ROWS_SIZE][LNG_CNT];

main.cmenu.c中并将其从头文件中删除,这样它就不会被重新定义。

实际上,它是用 0 重新定义和初始化的,在这种情况下适当的 main() 签名也是 int main(void).

另外,不要把定义放在头文件中,因为如果你把它包含到源文件中,然后link文件放在一起,那么多个定义错误会阻止编译。

在你的代码中

  //array defined here

是错误的概念。

你应该

  • menu.cmenu.c 使用 externTXT_STRINGS 应该出现在声明中)
  • 需要从 combo_strings.c 中删除 extern。 (TXT_STRINGS将在这里定义)

记住,extern 表示声明,而不是定义。如果您尝试使用 extern 初始化变量(就像您在 combo_strings.c 中所做的那样),您的编译器应该警告您。

也就是说,要打印 TXT_STRINGS[VERSIYON][Dil],您需要使用 %s 格式说明符,例如

 trace_printf("txt_str=%s",TXT_STRINGS[VERSIYON][Dil]);

真的,创建extern作用域变量的最佳位置
位于头文件中,按照惯例,该头文件提供了该外部变量对多个其他源文件的可见性。

还有一点,在您的示例中,您定义了字符串文字数组,其类型为 char *,而非 unsigned char * ,这会导致编译时赋值语句出现符号不匹配错误。对于下面的示例,我将使用 char *...

下面的示例说明了概念:

EDIT(更正数组索引大小以匹配示例)

在some.h

extern const char * TXT_STRINGS[5][2];//declare extern variable

然后在源文件一个源文件中定义extern变量

在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"