2013-08-01 100 views
1

我有文件A.c,B.c和B.h。 交流有一个头文件中的枚举声明

enum CMD{ 
    FIRST, 
    SECOND, 
    THIRD, 
}; 

,后来在该文件中有

bool function(...){ 
//... 
enum CMD data_type = FIRST; 
//... 
} 

在文件BC,我需要使用

if (data_type == FIRST){...} 

我试着在BH这包括:

extern enum CMD data_type; 

并且在A.c和B.c中包含#include“B.h”。 所有文件都位于项目的propper文件夹中。 但没有雪茄:( 卑诗省行给出这样的:

20: identifier "FROM_SMS" is undefined 
70: incomplete type is not allowed 

如何使这项工作交流文件是别人writen,我modifiing与BC代码原始代码是。一个烂摊子,我想尽可能减少:) 架构即STM32和我使用的是uVision 3 IDE。

谢谢

+0

你可能想显示你的一些实际* *代码,不是这个'FIRST' ... –

+0

对不起,有严格的公司政策对这样的事情:( –

+3

关于什么样的东西?您不必为了显示实际的代码;你只需要产生一个SSCCE([Short,Self-Contained,Correct Example](http://sscce.org/)),它不是公司代码,而是产生等价的错误信息编译器 –

回答

7

枚举是一种类型,你应该放在.h中。

extern关键字是变量。

编辑:对不起,我仔细阅读了你的代码。

这里的问题是,你会尝试使用枚举没有定义它。 认为当编译器编译某些东西时,它会分别获取每个.c文件,然后将include的内容“复制”到c文件中。

所以在这里你将有b.c其中包含b.h但由于你的类型的声明是在a.c中,编译器无法知道它,因此在尝试编译b.c时会引发错误。

要解决这个问题,只需在b.h顶部声明您的类型并将其包含在两个文件中,或者创建一个包含在需要它的.h/.c文件中的“myenum.h”文件。

+0

我在Ac中注释了枚举CMD {...}; definition(declaration?)并将其包含在Bh中,但现在它给了我'Bo文件中未定义的data_type符号' –

+0

这是因为data_type是局部的你的函数'bool函数(...)'。 你需要在函数外声明它,然后希望'bool函数(...)'在你需要之前调用。 n b.c并写入: 'extern enum CMD data_type;'在你的b.c中,也在任何其他函数定义之外。 –

+0

编译。我不会在给定的任务结束时使用'bool function()',所以我猜测它没问题。谢谢。 –

0

enum只是另一种类型的define。它只适用于当前翻译单位。