在外部定义外部变量

Defining external variable externally

我一直在四处寻找解决方案,尽管 SO 和其他地方的代码片段和解释似乎不起作用。我想要的是在外部定义一个非常大的数组,这样它就不会弄乱代码并在我的主文件中使用定义。

真的很简单:

controller.h 定义变量:

short KM[72][3][3][3][3][3][3];
KM[0][0][0][0][0][0][0] = 0;
KM[1][0][0][0][0][0][0] = 0;
KM[2][0][0][0][0][0][0] = 0;
// ...
// 50.000 more lines, not all =0

我希望它能在 main.ino 中工作:

extern short KM; // or KM[72][3][3][3][3][3][3], tried a lot
#include "controller.h"

void loop() {
...
}

但它没有(controller.h:[...]错误:'KM' 没有命名类型”)。我想要的只是 controller.h 中隔离的值可用于 main.ino.

我正在使用 Arduino IDE 和 ESP32。

你不能用这样的多个语句来初始化数组。尝试使用类似的东西:

  short KM[72][3][3][3][3][3][3] = {
    0, 0, ...
  };

或使用函数:

void initKM(short KM[72][3][3][3][3][3][3]) {
    KM[0][0][0][0][0][0][0] = 0;
}

你还应该在源文件中定义 KM (controller.c?) 并在头文件中包含 extern 这样如果你共享头文件就会有一个公里的定义。

请注意,我并不是真的要确定语法,而是让您了解如何实现它。

有关正确的初始化语法,请参阅 this answer

声明放入header文件中:

extern short KM[72][3][3][3][3][3][3];

定义放入源文件中:

short KM[72][3][3][3][3][3][3] = { … };

要仅将某些元素定义为 non-zero,请使用指定的初始值设定项:

short KM[72][3][3][3][3][3][3] = {
    [37][1][1][1][2][2][0] = 4,
    …
};

如果有运行个连续的non-zero个元素,可以指定第一个,然后列出后面的:

short KM[72][3][3][3][3][3][3] = {
    [37][1][1][1][2][2][0] = 4, 5, 6, 9, 3,
    …
};

(编译器可能会就此警告您,在这种情况下禁用该警告是可以接受的。)

在任何使用该数组的源文件中包含 header,包括定义它的源文件。

编译定义数组的源文件并在链接程序时包含它。

只有声明(包括定义)和预处理器语句可以是外部函数。 KM[0][0][0][0][0][0][0] = 0; 等赋值语句只能出现在函数内部。