我正在为 Esp32 编写 C 程序,以在 8x32 LED 矩阵上显示一些图像。 我很难以某种方式存储图像数据,不同的 .cpp 文件可以访问它,但它不会导致包含错误
图像存储在data.h中,例如像这样:
byte A[] = {
0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 1, 1, 1, 1, 0, 0,
0, 1, 0, 0, 1, 0, 0, 0,
0, 1, 1, 1, 1, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, };
项目越来越大,所以我想将 main.cpp 与 IR-Control 和 Game-Logic 分开(我还在上面编写了 Snake)。
所以文件夹结构是例如像这样:
问题是,在snake.cpp中,data.h以及game_of_life.cpp和其他文件中都被导入。我还尝试分离 .h 和 .cpp,我有像 extern byte A[32]; 这样的声明;在 data.h 中,以及一个包含上面代码的单独的 data.cpp 。但这也会导致相互矛盾的声明,例如
src/led_matrix_color_data.cpp:2:20: error: conflicting declaration 'uint32_t A_color [48]'
uint32_t A_color[48] = {
^
In file included from src/led_matrix_color_data.cpp:1:
include/led_matrix_color_data.h:5:13: note: previous declaration as 'byte A_color [48]'
extern byte A_color[48];
^~~~~~~
如果我在 data.h 中使用 Include Guards 或 #pragma 一次,这并不重要,因为数据是在那里定义的,所以它们将被忽略或某种形式。
我可以以什么方式存储数据,以便可以轻松地从其他 .cpp 文件(例如全局定义)访问它,但不会遇到包含错误?
谢谢 〜亚历克斯
简单。将数据放入自己的文件中,其他感兴趣的文件可以“看到”。
// data.h
#ifndef DATA_H
#define DATA_H
#ifdef GO_LIVE
#define GLOBAL // real meat-and-potatoes variables initialised
#else
#define GLOBAL extern // "phantom" declarations of things "out there somewhere"
#endif
GLOBAL byte arrayX[]; // forward declaration
#endif
和
// data.cpp - a "pure data" source file
#define GO_LIVE // give me the meat-and-potatoes
#include "data.h"
byte arrayX[ 48 ] = {
...
};
// and other "global" data definitions
和
// main.cpp
#include < standard C or C++ headers >
#include "data.h" // Let me "see" all those "extern" declarations
...
int main( void ) {
...
还有其他方便的方法可以实现此目的,但这将帮助您入门。一旦您的头脑有了这个概念,您就可以根据您的需要在多个源文件中共享(或不共享)数据和函数。编写代码时,请始终记住 KISS 原则 - “Keep It Simple Stupid”。投入巧妙的复杂性(因为你可以)无异于挖掘自己未来的坟墓。
请花更多时间沉浸在 C 语言中。“include”头文件所需的概念与 Python 的“import”不同。