我有三个标题文件ball.h
,wrappers.h
,graphics.h
和相应的.c
文件。每个.c
文件都包含相应的头文件,所有文件都包含防护。此外,wrappers.c
包括graphics.h
,wrappers.h
包含ball.h
,其中定义了一对const float
(及更多)。
在一个makefile中,我对上面的每一对都有一个表单的条目
name.o: name.c name.h
$(CC) -c $^
test.c
。最后,我有一个test: test.c wrappers.o graphics.o ball.o
文件(带有一个main函数),其中包含上述每个头文件,其makefile条目为$(CC) $^ -o $@
test
。
编译const float
会导致多个定义错误,并说上述两个wrappers.o
首先在ball.o
和wrappers.h
中定义。
我想这是因为ball.h
包含ball.h
,但我不知道如何解决这个问题,除了移动有问题的变量,或者更糟糕的是,更改我的代码。问题是由于包含尴尬,还是因为makefile的结构?
#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 */
摘录:
;with mycte as (
select 1 as ID , '2017-08-01' as date1
union all
select 1 as ID , '2017-08-02' as date1
)
Select distinct mycte.*
from mycte
inner join mycte mycte2
on mycte.ID = mycte2.ID
and mycte.date1 = (select max(mycte3.date1) from mycte mycte3 where mycte3.id = mycte.ID)
答案 0 :(得分:3)
将评论转换为答案。
在C中,每次包含User
时,都会获得定义的ball.h
和circleRadius
常量的全局副本。他们需要circleColor
(以及static
),或者您需要在标题中声明它们const float
(没有初始化程序)并在一个源文件中完全定义它们。 / p>
这是C ++中的规则与C中的规则不同的区域;注意你使用的编译器。
我之前没有使用
extern
;我该怎么用呢? (现在您提到它,extern
对于这个特定项目可能是一个好主意,但我也想尝试static
解决方案。)
在标题中,写下:
extern
在一个源文件中,写:
extern const float circleRadius;
重复颜色。对于整数值,您可以考虑使用const float circleRadius = 0.025;
(有关详细信息,请参阅static const
vs #define
vs enum
。)对于浮点(或者实际上是整数值),您可以在标题中使用此代码:
enum
显然,您更改了引用的拼写(所有大写字母都是#define CIRCLE_RADIUS 0.025
的惯例 - 以及许多#define
- 常量)。
此外,正如WhozCraig中comment所指出的那样,问题Why do we need the extern
keyword in C if file scope declarations have external linkage by default?可能会有所帮助。