在外部定义外部变量
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;
等赋值语句只能出现在函数内部。
我一直在四处寻找解决方案,尽管 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;
等赋值语句只能出现在函数内部。