【发布时间】:2019-03-01 17:01:44
【问题描述】:
我是 c 编程语言的新手,从另一篇文章中看到,一旦将头文件包含到另一个头文件中,就不会保留头文件保护。我认为这意味着如果我要将第二个头文件包含到第三个头文件中,我会遇到符号重新定义问题。我决定使用另一篇文章中的示例代码进行尝试,是的,我确实收到了错误。我附上了下面的代码。是否因为 foo.h 包含定义而不仅仅是声明而出现此错误? foo.h 中定义的结构的定义应该在 foo.c 中吗?如果是这样,我应该使用什么方法让多个编译单元建立在前一个功能的基础上?在堆栈架构中,各层如何访问前一层的功能(它们是否包含头文件或遵循其他方法)?
/*
* foo.h
*
*/
#ifndef FOO_H_
#define FOO_H_
#include "stdint.h"
uint8_t test();
typedef struct regVal{
uint16_t add;
uint8_t val;
}reg;
const struct regVal regArr[] =
{
{0x3103,0x03},
{0x3008,0x82},
{0xFFFF,0xFF}
};
#endif /* FOO_H_ */
/*
* foo.c
*/
#include "foo.h"
#include "stdint.h"
uint8_t test();
uint8_t test(){
return 0x01;
}
/*
* foo2.h
*
*/
#ifndef FOO2_H_
#define FOO2_H_
#include "foo.h"
#include "stdint.h"
#endif /* FOO2_H_ */
/*
* foo3.h
*
*/
#ifndef FOO3_H_
#define FOO3_H_
#include "foo2.h"
#include "stdint.h"
#endif /* FOO3_H_ */
/*
* foo3.c
*/
#include "foo3.h"
#include "stdint.h"
这是链接器错误
>symbol "regArr" redefined: first defined in "./foo.obj"; redefined in "./foo3.obj" null: symbol "regArr" redefined: first defined in "./foo.obj"; redefined in "./foo3.obj"
【问题讨论】:
-
您的头球后卫没问题,您遇到的问题与头球后卫无关。全局变量必须在 .c 文件中声明,而不是在头文件中。在您的情况下,应该声明
regArr,例如在foo3.c -
我可以在 foo.c 中声明 regArr 吗?
-
是的,您可以在需要的C文件中声明。
-
@kial 不,你必须 define 它,而不仅仅是 declare 它(见我的回答)