Имеет ли "static / extern uint8_t array [2] = {0};"соответствовать спецификации ANSI C? - PullRequest
9 голосов
/ 15 ноября 2011

У меня вопрос по поводу следующего кода:

#include "all_needed.h"

static uint8_t array[2] = {0};

void main(void)
{
  ...
}

Разрешено ли инициализировать (модульный) глобальный массив, как указано выше, для установки каждого элемента в ноль при условии соответствия ANSI C?

У меня есть проблема в Code Composer 5 (проект MSP430), где мне пришлось изменить его на

static uint8_t array[2] = {0, 0};

для правильной инициализации второго члена массива.

Ответы [ 5 ]

11 голосов
/ 15 ноября 2011

Да, это разрешено и должно инициализировать массив до нуля.C99, §6.7.8 p10:

Если объект, имеющий статическую продолжительность хранения, не инициализируется явно, то:

- если он имеет тип указателя, он инициализируется внулевой указатель;

- если он имеет арифметический тип, он инициализируется (положительным или беззнаковым) нулем;

- если это агрегат, каждый элемент инициализируется (рекурсивно) в соответствии с этимиправила;

- если это объединение, первый именованный элемент инициализируется (рекурсивно) в соответствии с этими правилами.

и p21:

Если естьЕсли в списке, заключенном в фигурные скобки, меньше инициализаторов, чем элементов или членов агрегата, или меньше символов в строковом литерале, используемом для инициализации массива известного размера, чем элементов в массиве, остальная часть агрегата должна быть инициализировананеявно совпадает с объектами со статической продолжительностью хранения.

Сообщите об ошибке поставщику компилятора.

6 голосов
/ 16 ноября 2011

Спасибо за все ваши ответы!Я также исследовал и обнаружил, что компилятор не соответствует требованиям, как описано в http://www.ti.com/lit/pdf/SLAU157 в разделе B.5.1 «Инициализация статических и глобальных переменных»:

Приложение B: IAR2.x / 3.x / 4.x в CCS C-Миграция

B.5 Другие различия

B.5.1 Инициализация статическогои глобальные переменные

Стандарт ANSI / ISO C определяет, что статические и глобальные (внешние) переменные без явной инициализации должны быть предварительно инициализированы равными 0 (до запуска программы).Эта задача обычно выполняется при загрузке программы и реализуется в компиляторе IAR:

/* IAR, global variable, initialized to 0 upon program start */
int Counter;

Однако компилятор TI CCS не выполняет предварительную инициализацию этих переменных;следовательно, это приложение должно выполнить это требование:

/* CCS, global variable, manually zero-initialized */
int Counter = 0;
5 голосов
/ 15 ноября 2011

Стандарт C гласит (6.7.8.21):

Если в списке, заключенном в фигурные скобки, меньше инициализаторов, чем элементов элементов совокупности [...], остатокагрегата должны быть инициализированы неявно так же, как объекты, которые имеют статическую продолжительность хранения.

В 6.2.5.21:

Типы массива и структуры вместе называются типами агрегата.

Другими словами, ваш код в порядке.

4 голосов
/ 15 ноября 2011
static uint8_t array[2] = {0};

В соответствии со стандартом C это приведет к инициализации обоих членов array равным 0. Если ваш компилятор не обнуляет их, значит, это нарушение.

0 голосов
/ 18 ноября 2011

Я работаю с PIC micros, поэтому ваш пробег может отличаться ...

Существуют различные библиотеки запуска, на которые я могу ссылаться. Одна не инициализирует ОЗУ.Один очистит всю оперативную память до 0. Другой с обычной инициализацией переменных.

Посмотрите на файл компоновщика и посмотрите, что он делает.

...