[uquote="WiseLord",url="/forum/viewtopic.php?p=3818622#p3818622"]
KorbenDallas, не говорите ерунды. Обычный C, с ассемблерными вставками. Ну и ещё идиотскими отступами по коду.[/uquote]
Нет. Никакой ерунды. В языке С на уровне файла не допускаются инициализации вида
Код: Выделить всё
const int A = 42;
const int B = A; /* <- Ошибка: инициализатор должен быть константным выражением! */
Переменные, объявленные с `const`, в языке С (в отличие от С++) не являются константами времени компиляции и не могут быть использованы там, где требуются
константные выражения. В частности, `const` переменные не могут быть использованы для инициализации переменных со статическим классом хранения, то есть не могут быть использованы для инициализации других переменных уровня файла.
Вышеприведенный код (как и код автора вопроса)
принимается компиляторами группы GCC/Clang только в качестве
нестандартного расширения языка С. Это расширение появилось в GCC начиная с версии 8
GCC 7.3:
https://godbolt.org/z/0wEtZJGCC 8.1:
https://godbolt.org/z/Tw8kL9[uquote="WiseLord",url="/forum/viewtopic.php?p=3818622#p3818622"]Но не под GCC, а под какой-то другой компилятор[/uquote]
Нет. Именно под GCC или совместимый компилятор (Clang?). Остальные компиляторы С по прежнему продолжают честно отлавливать эту ошибку.
---
[uquote="ozonn",url="/forum/viewtopic.php?p=3818654#p3818654"]подскажите, как сделать так, чтобы переменная, объявленная в одном файле, была видна во всех остальных?[/uquote]
1. В стандартном языке С вам придется идти по классическому пути: создать заголовочный файл с extern-объявлением переменной (без инициализатора).
А в одном из файлов реализации сделать
определение этой переменной (возможно с инициализатором)
2. Многие компиляторы языка С (GCC, Clang, MSVC и т.д. и т.п.) поддерживают популярное нестандартное расширение языка С, разрешающее множественные глобальные
определения переменных между разными единицами трансляции, при условии, что такие переменные не содержат инициализатора. Это позволяет вам напрямую, прямо в заголовочном файле сделать определение переменной
и все. Формально такое определение приводит к множественному определению сущности с внешним связыванием, т.е. к нарушению требований языка. Но вышеупомянутые реализации на этапе линковки просто молча сливают множественные определения в одно, т.е. вы получаете требуемую глобальную переменную.
3. В языке С++ у вас есть либо классический способ (см. 1), либо определение переменной прямо в заголовочном файле как `inline`
Последний вариант доступен начиная с С++17