定义全局变量,在主

时间:2015-06-26 13:26:25

标签: c gcc global-variables

编写代码c,编译gcc。 我在main.c和menu.c中使用全局数组,在main中没有预期的工作。但是在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"

}

3 个答案:

答案 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 externmenu.cmenu.c应该出现ar声明)
  • 需要从TXT_STRINGS移除extern。 (combo_strings.c将在此处定义)

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

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

%s