main.c无法识别keyboard.c中的变量

问题描述

我一直试图在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 中定义的符号有效)
  • 编译器不会忽略keyboard.c( keypad.c 中的错误出现在编译输出中)
  • 我没有忘记将.c / .h文件添加到项目中(它们出现在解决方案资源管理器中)

我怀疑构建顺序被弄乱了,但是我不确定在Atmel Studio中构建构建顺序的位置,但这只是一个猜测。我将文件样本放在下面。唯一的错误来自 main.c 引用 keypad.c

// main.c
#define F_CPU 16000000
#define NULL 0

#include <util/delay.h>
#include <avr/io.h>
#include "lcd.h"
#include "keypad.h"

void example() {
    int header_example = KEY_1; // From keypad.h,no error
    uint16_t c_example = keypad; // from keypad.c,error
}
// ...
// 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;
// ...

Atmel Studio Solution Explorer

解决方法

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

// 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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...