Почему можно инициализировать глобальную переменную с помощью кода встроенного ассемблера? - PullRequest
0 голосов
/ 29 декабря 2018

Рассмотрим этот код, который будет компилироваться в PIC32 (источник: openscope-mz)

static  uint32_t    tSLoop              = ReadCoreTimer();

static inline uint32_t ReadCoreTimer(void)
{
    uint32_t coreTimerCount;
    __asm__ __volatile__("mfc0 %0,$9" : "=r" (coreTimerCount));
    return(coreTimerCount);
}

Пожалуйста, объясните, почему это действительный код на Си.

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Это действительный код, потому что это C ++, а не C. Как указывает Камил Кук , код, похоже, приходит из файла C ++ в openscope-mz проект.C ++ допускает инициализаторы такого рода, в то время как C допускает только расширения, зависящие от реализации.

0 голосов
/ 29 декабря 2018

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

Строка

static  uint32_t    tSLoop              = ReadCoreTimer();

взята из LoopStats.cpp , который является файлом C ++.

...