Ошибка: invalid application of 'sizeof' to incomplete type 'int []' при попытке вычислить размер массива в библиотеке

Я создал библиотеку, содержащую массив. Это файл .h:

class Lib {
  public:
    static int arr[];
};

А это файл .cpp:

#include "Lib.h"

int Lib::arr[] = {0, 1, 2, 3};

При попытке вычислить размер этого массива из библиотеки все работает нормально. При попытке сделать это из скетча я получаю указанную в заголовке ошибку. Это скетч, который я использую:

#include <Lib.h>

void setup() {
  sizeof(Lib::arr);
}

void loop() {}

В чем здесь проблема?

, 👍1

Обсуждение

Возможно, вы можете попытаться добавить постоянное целое число в свою библиотеку, содержащее размер массива, и использовать это целое число в своем скетче., @Michel Keijzers

@LukasFin Я добавил ответ., @Michel Keijzers

Кажется, что статический инициализатор не был выполнен при запуске скетча. Мне это кажется странным. Вы пытались получить доступ к первому элементу массива (например) из скетча? Я бы также использовал некоторые необычные значения для инициализации массива, например, 53, 33, 4, 12, чтобы быть уверенным, что вы не получите доступ к 0 инициализированной памяти в Lib:arr[0]. Если вы найдете правильное значение, то хотя бы инициализация работает. Но тогда у меня нет лучшего объяснения. Кстати: правильная инициализация C++ статических переменных: int Lib::arr[4] = {0, 1, 2, 3};. Возможно, это имеет значение., @Peter Paul Kiefer

Извините, мой предыдущий комментарий - ерунда. Поскольку это ошибка компилятора, а sizeof — функция компилятора, которая работает с объявленными типами, причина ошибки объяснима. В заголовочном файле массив не инициализирован и его размер не указан. Заголовочный файл — это единственное, что известно компилятору при компиляции скетча. Файл cpp компилируется в объектный файл на другом этапе. Объектный файл компонуется после запуска компиляции. Таким образом, все, что происходит в файле cpp, неизвестно компилятору, когда он компилирует скетч. Если вы объявите массив с размером, он будет работать. Я так ..., @Peter Paul Kiefer


1 ответ


Лучший ответ:

1

Причина в том, что в свой скетч вы импортируете только заголовочный файл (что хорошо). Однако там это массив (int[]), а не инициализированный массив.

Для этого вам нужно будет включить cpp, но это плохая практика (если вообще возможно).

Вместо этого создайте новую (постоянную) переменную и назначьте ее.

(более или менее псевдокод из-за отсутствия компилятора):

Библиотека.h:

class Lib {
  public:
    static int arr[];
    static int arr_length;
};

Библиотека.cpp:

#include "Lib.h"

int Lib::arr[] = {0, 1, 2, 3};
int Lib::arr_length = sizeof(Lib::arr); 

Скетч:

#include <Lib.h>

void setup() {
  Lib::arr_length;
}


void loop() {}

См. также комментарий LukasFun ниже. Также можно задать размер массива в заголовочном файле.

Я бы посоветовал хранить все назначения в файле реализации (cpp). Заголовочный файл предназначен для определения элементов, файл реализации для инициализации/назначения. Но это также работает для инициализации элементов в заголовочном файле.

,

Я только что попытался установить размер массива непосредственно в файле .h. Если я это сделаю, скетч компилируется без ошибок. Может быть, вы могли бы добавить это к своему ответу., @LukasFun

@LukasFun Правда, я добавил комментарий, однако все же лучше выполнять инициализацию в файле реализации., @Michel Keijzers