在另一个头文件中编译定义函数时出现问题

时间:2013-06-30 22:22:01

标签: c definition

所以我想知道为什么我收到以下错误:

  

错误1对“MIN_COUNTER”C:\ Users \ Wyatt的未定义引用   克罗斯比\ Dropbox的\爱特梅尔   Studio \ ReflowController \ ReflowController \ ReflowController \ Debug /.././ ReflowController.c 146 1 ReflowController

在PID.h中我有:

#ifndef PID_H
#define PID_H

#define LCD_SCREEN_SIZE     16
#define MAX_COUNTS          180
#define OVEN_MAX_TEMP       260
#define OVEN_MIN_TEMP       0
#define MIN_COUNTER(x,a)    tempLookupArray[x] < a ? x : MIN_COUNTER(x+1,a)         
#define FIND_COUNTER(a)     a <= OVEN_MIN_TEMP ? MAX_COUNTS : MIN_COUNTER(0,a)
const float tempLookupArray[MAX_COUNTS];
...

其中tempLookupArray在PID.c中进一步定义:

const float tempLookupArray[MAX_COUNTS] = {
    260.00,
    260.00,
    260.00,
    259.99,
    259.98,
    259.96,
          ...

在ReflowController.c中我包含PID.h并写:

TriggerCounter = FIND_COUNTER(PIDgain);

其中PIDgain是局部的并且类型为'float',而TriggerCounter是全局的并且类型为'volatile int'

似乎是我试图从MIN_COUNTER 内部调用MIN_COUNTER,并且还没有任何原型(如果它是一个函数)。 。 。

你们那些聪明人的想法吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

预处理器完成代码后,

TriggerCounter = FIND_COUNTER(PIDgain);

变为

TriggerCounter = PIDgain <= 0 ? 180 : tempLookupArray[0] < PIDgain ? 0 : MIN_COUNTER(0+1,PIDgain);

此时,预处理器将代码交给编译器和链接器,后者寻找名为MIN_COUNTER但无法找到的方法。在这种情况下,预处理器不会递归地工作。想象一下,如果它做了:你编写的代码会在无限循环中发送编译器;它需要扩展MIN_COUNTER并且为此,需要扩展另一个MIN_COUNTER等等......

尝试使用实际功能而不是宏

int min_counter(int x, float a) {
    return tempLookupArray[x] < a ? x : min_counter(x+1,a);
}

int find_counter(float a) {
    return a <= OVEN_MIN_TEMP ? MAX_COUNTS : min_counter(0,a);
}

除了正确递归之外,它还会避免一些宏的警告(例如,FIND_COUNTER(i++)会多次递增i,而find_counter(i++)则不会)