位声明 - 对变量'

时间:2015-04-29 12:57:23

标签: c declaration definition extern undefined-reference

我有问题和希望,你可以帮助我。 我尝试在两个dsPIC30F4011之间进行CAN通信。它也有效。现在我必须制作标识符。我必须使用SID和EID。它们分为4个部分。我想做一个声明并得到一个错误。 我制作了一个新的头文件

#ifndef IDENTIFIER_H
#define IDENTIFIER_H

#ifdef  __cplusplus
extern "C" {
#endif




#ifdef  __cplusplus
}
#endif

#endif  /* IDENTIFIER_H */


#include <p30F4011.h>
#include "system.h"
#include <p30fxxxx.h>


typedef struct tagCxTXxSIDBITS{
    unsigned          : 11;
    unsigned PRIO4_0  : 5;
}CxTXxPRIOBITS;

extern volatile unsigned int C1TX0PRIO __attribute__((__sfr__));
extern volatile CxTXxPRIOBITS C1TX0PRIObits __attribute__((__sfr__));
extern volatile unsigned int C1TX1PRIO __attribute__((__sfr__));
extern volatile CxTXxPRIOBITS C1TX1PRIObits __attribute__((__sfr__));
extern volatile unsigned int C1TX2PRIO __attribute__((__sfr__));
extern volatile CxTXxPRIOBITS C1TX2PRIObits __attribute__((__sfr__));

在我想编写的代码中

...
...
C1TX0PRIO = 0x0000;
...

如果我想构建项目,我会收到错误

build/default/production/CAN_function.o(.text+0x66): In  function    `.LSM19':
: undefined reference to `_C1TX0PRIO'
make[2]: *** [dist/default/production/blink.X.production.hex] Error 255
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

我做错了什么? 我在p30F4011.h中写了它。

2 个答案:

答案 0 :(得分:1)

  

TL; DR - 声明不分配内存,定义确实如此。

根据C11标准文件,章节§6.7,声明,

  

声明指定一组标识符的解释和属性。标识符的定义是该标识符的声明:

     

- 对于一个对象,导致为该对象保留存储;

     

- .....

当您放置extern存储类说明符时,您声明变量,而不是定义

因此,在使用变量之前,您需要定义变量。

添加

volatile unsigned int C1TX0PRIO;

在源文件中。

答案 1 :(得分:1)

标题中声明为extern的变量。

如果要从多个源文件中使用该变量,通常需要将变量作为extern放在标题中。通过这种方式,可以在包含此标头的所有源文件中访问该变量。但是,在其中一个C文件中,您需要具有以下内容:

volatile unsigned int C1TX0PRIO __attribute__((__sfr__));