在外部定义外部变量

问题描述

我一直在寻找解决方案,尽管有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,...
  };

或使用功能:

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

还应该在源文件(KM?)中定义controller.c,并在头文件中包含extern,这样,如果您共享头,将只有一个定义。 KM。

请注意,我并不是真正地试图确定语法,而是让您了解如何实现此语法。

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

,

声明放在头文件中:

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

定义放入源文件:

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

要将仅某些元素定义为非零,请使用指定的初始化程序:

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

如果有连续的连续非零元素,则可以指定第一个元素并列出以下元素:

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

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

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

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

只有声明(包括定义)和预处理程序语句可以在函数外部。诸如KM[0][0][0][0][0][0][0] = 0;之类的赋值语句只能出现在函数内部。