【问题标题】:Defining external variable externally在外部定义外部变量
【发布时间】:2020-09-06 19:09:21
【问题描述】:

我一直在寻找解决方案,尽管在 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: [...] error: 'KM' does not name a type”)。我想要的只是隔离在 controller.h 中的值,以便在 main.ino 中使用。

我正在使用 Arduino IDE 和 ESP32。

【问题讨论】:

  • arduino 是 C++。

标签: c global external extern


【解决方案1】:

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

  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;
}

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

请注意,我并不是真的试图确定语法,而是让您了解如何实现这一点。

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

【讨论】:

    【解决方案2】:

    声明放在头文件中:

    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; 等赋值语句只能出现在函数内部。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-20
      • 1970-01-01
      • 1970-01-01
      • 2012-12-02
      • 2019-10-05
      • 1970-01-01
      • 2021-08-18
      • 2023-03-06
      相关资源
      最近更新 更多