Can';t整理多个定义
我有三个头文件Can';t整理多个定义,c,makefile,multiple-definition-error,C,Makefile,Multiple Definition Error,我有三个头文件ball.h,wrappers.h,graphics.h,以及相应的.c-文件。每个.c文件都包含其相应的头文件,所有头文件都包含防护装置。此外,wrappers.c包括graphics.h和wrappers.h包括ball.h,它定义了一对常量float(以及更多) 在一个makefile中,我为上面的每一对都有一个表单条目 name.o:name.c name.h带$(CC)-c$^。最后,我有一个test.c文件(带有一个主函数),其中包括上述每个头文件,其makefile条
ball.h
,wrappers.h
,graphics.h
,以及相应的.c
-文件。每个.c
文件都包含其相应的头文件,所有头文件都包含防护装置。此外,wrappers.c
包括graphics.h
和wrappers.h
包括ball.h
,它定义了一对常量float
(以及更多)
在一个makefile中,我为上面的每一对都有一个表单条目
name.o:name.c name.h
带$(CC)-c$^
。最后,我有一个test.c
文件(带有一个主函数),其中包括上述每个头文件,其makefile条目是test:test.c wrappers.o graphics.o ball.o
,带有$(CC)$^-o$@
编译test
会导致多个定义错误,即前面提到的两个const float
首先在wrappers.o
和ball.o
中定义
我想这是因为wrappers.h
包含ball.h
,但我不知道如何解决这个问题,除非移动有问题的变量,或者更糟糕的是,更改代码。问题是由于笨拙的include,还是因为makefile的结构
ball.h
摘录:
#ifndef BALL_H
#define BALL_H
const float circleRadius = 0.025;
const float circleColor = 0;
typedef struct {
float x,y; // etc
} ball_t;
// various function prototypes
#endif /* BALL_H */
将评论转换为答案
在C中,每次包含
ball.h
,都会得到定义的circleRadius
和circleColor
常量的全局副本。它们需要是静态的
(以及常量浮点
),或者您需要在头文件中声明它们外部的
(没有初始值设定项),并在一个源文件中完全定义它们
<>这是C++中的规则与C中的规则不同的区域;注意你使用的编译器
我以前没有使用过extern
;我该怎么用?(现在您已经提到了,static
对于这个特定的项目可能是个好主意,但我也想尝试一下extern
解决方案。)
在标题中,写入:
extern const float circleRadius;
在一个源文件中,写入:
const float circleRadius = 0.025;
同样重复颜色。对于整数值,您可以考虑使用<代码> EnUM < /C> >(请参阅详细信息)。对于浮点(或者,实际上,整数值),您可以在头中使用这个代替:
#define CIRCLE_RADIUS 0.025
显然,您需要更改引用的拼写(所有大写字母都是#define
-和许多enum
-常量的惯用字母)
此外,正如a中所指出的,该问题可能会有所帮助。将评论转换为答案
在C中,每次包含
ball.h
,都会得到定义的circleRadius
和circleColor
常量的全局副本。它们需要是静态的
(以及常量浮点
),或者您需要在头文件中声明它们外部的
(没有初始值设定项),并在一个源文件中完全定义它们
<>这是C++中的规则与C中的规则不同的区域;注意你使用的编译器
我以前没有使用过extern
;我应该如何在这里使用它?(现在您已经提到了,static
对于这个特定的项目可能是个好主意,但我也想尝试一下extern
解决方案。)
在标题中,写入:
extern const float circleRadius;
在一个源文件中,写入:
const float circleRadius = 0.025;
同样重复颜色。对于整数值,您可以考虑使用<代码> EnUM < /C> >(请参阅详细信息)。对于浮点(或者,实际上,整数值),您可以在头中使用这个代替:
#define CIRCLE_RADIUS 0.025
显然,您将更改引用的拼写(所有大写都是;define
-和许多enum
-常量的习惯)
此外,正如a中所指出的,这个问题可能会有所帮助。“…包括ball.h,它定义了一对常量浮点(以及更多)。-这个问题应该包括该代码。没有代码,我们求助于安慰。我的水晶球告诉我,你在标题中直接定义这些变量,而不是在标题中声明它们
extern
,并在单个C翻译单元中实际定义它们。或者,您可以通过在标题中声明+定义多个定义static
,来接受多个定义。对于常数,任何一种方法都应该有效。在C中,每次包含ball.h
,您都会得到定义的circleRadius
和circleColor
常量的全局副本。它们需要是静态的
(以及常量浮点
),或者您需要在头文件中声明它们外部的
,并在一个源文件中完全定义它们。这是C++中与C中的规则不同的区域;注意你使用的编译器。谢谢各位。我以前没有使用过extern
,在这里应该如何使用?(现在您已经提到了,静态
对于这个特定的项目可能是个好主意,但我也想尝试外部
解决方案。)代码>在标题中。在一个源文件中:const float circleRadius=0.025代码>。同样重复颜色。对于整数值,您可以考虑使用<代码> EnUM < /代码>。对于浮点,可以在标题中使用#定义圆半径0.025
。可能会被证明是有用的。“…包括ball.h,它定义了一对常量float(以及更多)。”-这个问题应该包括该代码。没有代码,我们求助于安慰。我的水晶球告诉我,你在标题中直接定义这些变量,而不是在标题中声明它们extern
,并在单个C翻译单元中实际定义它们。或者,您可以通过在标题中声明+定义多个定义static
,来接受多个定义。对于常量,这两种方法都应该有效