Здесь есть разные проблемы.
Сначала ваш последний член имеет неполный тип, потому что это массив необъявленного измерения. Это не разрешено в C ++, но большинство компиляторов допускает его как расширение с той же семантикой, что и в C. В любом случае, это довольно сложно использовать, поскольку его можно использовать только с выделенными структурами, где вы выделяете память для самой структуры и неполный массив.
Далее вы пытаетесь присвоить массиву. Ты не можешь. Массивы не являются объектами первого класса в C ++ (и в C). Вы можете инициализировать массив целиком, но можете назначить его только элементу массива.
И наконец, вы назначаете C литеральную строку для char *
. Это плохо, потому что стандарт объявляет, что литеральные строки имеют значение const
, поэтому использование более позднего указателя для изменения символа будет неопределенным поведением. Это сработает, если вы этого не сделаете, но указатели должны быть по крайней мере объявлены как const
.
Вот как вы можете использовать все это:
widget_t* setUpFunction () {
// allocates a widget_t with 2 slots in nicknames
widget_t *someWidget = (widget_t *) malloc(sizeof(widget_t) + 2 * sizeof(char *));
someWidget.name = (char *)"Lawn Mower"; // VERY DANGEROUS: pointer should be const
someWidget.numberOfNicknames = 2;
someWidget.nicknames[0] = (char *) "Choppie McGrasschopper"; // SAME DANGER
someWidget.nicknames[1] = (char *) "Really Noisy" // Still same danger
return widget_t;
}
Но все это скорее C-ish и его следует избегать в C ++. Кроме того, он все еще требует выделенной памяти, что может не соответствовать тому, что вы хотите для Arduino
Для следования предложению фиктивных объектов Jason необходимо смотреть на статью "Interfacing with hard-to-test third party controls" Misko Hevery. Это непосредственно обращается к сторонним компонентам тестирования.
Обычно Вы используете фиктивные объекты для "фальсифицирования" результатов тех системных вызовов.
Во время тестирования используйте фиктивные объекты и сделайте, чтобы они возвратили различные результаты, которые Вы ожидали бы на различных платформах, тестируя, что Ваш код реагирует правильно в тех случаях.