main.c是';t从键盘识别变量。c

main.c是';t从键盘识别变量。c,c,header-files,atmega,atmelstudio,C,Header Files,Atmega,Atmelstudio,我一直试图在Atmel Studio中编写一个atmega328p(很有趣),但当我试图将键盘代码分离到它自己的c文件中时,我遇到了一个错误 Error 'keypad' undeclared (first use in this function) invisible_alarm C:\Users\kenkr\Documents\Atmel Studio\7.0\invisible_alarm\invisible_alarm\main.c 39 键盘在单独的文件中定义

我一直试图在Atmel Studio中编写一个atmega328p(很有趣),但当我试图将键盘代码分离到它自己的c文件中时,我遇到了一个错误

Error       'keypad' undeclared (first use in this function)    invisible_alarm C:\Users\kenkr\Documents\Atmel Studio\7.0\invisible_alarm\invisible_alarm\main.c    39
键盘在单独的文件中定义,我排除了以下几点:

  • 我没有忘记h文件(使用keypad.h works中定义的符号)
  • 编译器没有忽略keypad.c(编译输出中会出现keypad.c中的错误)
  • 我没有忘记将.c/.h文件添加到项目中(它们出现在解决方案资源管理器中)
我怀疑构建顺序是混乱的,但我不确定在Atmel Studio中构建顺序设置在哪里,但这只是一个猜测。我把我的文件样本放在下面。唯一的错误来自main.c引用的keypad.c

//keypad.c

#包含

您需要在头文件中声明变量:

// keypad.h
#ifndef _KEYPAD_H_
#define _KEYPAD_H_

#include <stdint.h> // commonly needed for uint16_t

#define KEY_1 0
#define KEY_4 1
// ...

extern uint16_t keypad;

#endif
//keypad.h
#ifndef\u键盘\u H_
#定义小键盘_
#包括//uint16\U t通常需要的
#定义键_1 0
#定义键4 1
// ...
外部uint16_t键盘;
#恩迪夫

您的头文件缺少
外部uint16\t键盘或类似的。谢谢我不知道你也可以在头文件中定义状态。如果是这样的话,也许我可以把所有的东西都放进一个.h文件。不。您不能将所有内容都放在.h文件中,至少您不应该这样做。我建议你通读一些c头文件教程/解释。这能回答你的问题吗@皮洛克为什么不呢?有很多教程说你应该使用.c文件,但我还没有看到一个给出一个很好的理由。
// keypad.h
#ifndef _KEYPAD_H_
#define _KEYPAD_H_

#define KEY_1 0
#define KEY_4 1
// ...

#endif
// keypad.c
#include <avr/io.h>
#include <util/delay.h>
#include "keypad.h"
#define NULL 0

uint16_t keypad = 0x0000;
// ...
// keypad.h
#ifndef _KEYPAD_H_
#define _KEYPAD_H_

#include <stdint.h> // commonly needed for uint16_t

#define KEY_1 0
#define KEY_4 1
// ...

extern uint16_t keypad;

#endif