无法理清多重定义

时间:2017-08-27 20:55:12

标签: c makefile multiple-definition-error

我有三个标题文件ball.hwrappers.hgraphics.h和相应的.c文件。每个.c文件都包含相应的头文件,所有文件都包含防护。此外,wrappers.c包括graphics.hwrappers.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.owrappers.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)

1 个答案:

答案 0 :(得分:3)

将评论转换为答案。

在C中,每次包含User时,都会获得定义的ball.hcircleRadius常量的全局副本。他们需要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 - 常量)。

此外,正如WhozCraigcomment所指出的那样,问题Why do we need the extern keyword in C if file scope declarations have external linkage by default?可能会有所帮助。