定义全局变量,在 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.c
和menu.c
中并将其从头文件中删除,这样它就不会被重新定义。
实际上,它是用 0
重新定义和初始化的,在这种情况下适当的 main()
签名也是 int main(void)
.
另外,不要把定义放在头文件中,因为如果你把它包含到源文件中,然后link文件放在一起,那么多个定义错误会阻止编译。
在你的代码中
//array defined here
是错误的概念。
你应该
- 对
menu.c
和 menu.c
使用 extern
(TXT_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"
写代码c,编译gcc。 我在 main.c 和 menu.c 中使用全局数组,主要没有预期的工作。但在 menu.c 中运行良好。有什么不同。
在combo_strings.c
中定义的全局数组TXT_STRINGScombo_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.c
和menu.c
中并将其从头文件中删除,这样它就不会被重新定义。
实际上,它是用 0
重新定义和初始化的,在这种情况下适当的 main()
签名也是 int main(void)
.
另外,不要把定义放在头文件中,因为如果你把它包含到源文件中,然后link文件放在一起,那么多个定义错误会阻止编译。
在你的代码中
//array defined here
是错误的概念。
你应该
- 对
menu.c
和menu.c
使用extern
(TXT_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"