Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t整理多个定义_C_Makefile_Multiple Definition Error - Fatal编程技术网

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
,来接受多个定义。对于常量,这两种方法都应该有效