Страницы

Поиск по вопросам

среда, 18 декабря 2019 г.

Защита от некорректного использования extern в C

#c


Есть ли какая-то - на уровне стандарта - защита от некорректного использования объявлений
extern в C? Например, пусть в одном файле есть

extern int global;


в другом - 

double global = 3.1416;


Ведь mangling имен - это только в C++, который, конечно, в этой ситуации защитит
(на уровне линковщика), в отличие от C, который должен скомпилировать и не поморщиться...

Получается, что в обычном C - только совесть программиста препятствие к некорректному
использованию? никакого иного механизма нет (помимо вынести объявление extern в заголовочный
файл и включать его во все файлы проекта)?
    


Ответы

Ответ 1



В принципе на практике следует поступать именно так: объявление с extern должно располагаться в заголовочном файле, а определение (с инициализатором) в некоем файле реализации включающем этот заголовочный файл. Тогда есть надежда, что такие очевидные ошибки вызовут диагностическое сообщение от компилятора. Никакой другой "официальной" защиты в С нет.

Ответ 2



Давайте начнём с того, что уясним, что данная проблема - это не проблема компилятора или конкретного языка программирования. Если модуль А компилируется сегодня в Голландии, а модуль В - через три года в Урюпинске, то НИКАКОЙ компилятор или язык программирования не сможет обеспечить проверку внешних описаний. Далее, можно ли считать данную проблему проблемой линкера? Отчасти... Т.е. если данный конкретный формат объектного модуля ПРЕДУСМАТРИВАЕТ описание типа для каждой области внешней памяти, то линкер сможет выполнить эту проверку, если он на это запрограммирован. И вылазит две проблемы: Существуют разные форматы ОМ даже в рамках одной ОС Существуют разные линкеры даже для одного формата ОМ Вы говорите о каких-то конкретных формате ОМ и линкере? Если речь идёт о линкере ld из состава linux, для модулей ELF, то рекомендую посмотреть на его опцию --warn-common. Как мне кажется, она может выдать предупреждения о всех подозрительных местах.

Комментариев нет:

Отправить комментарий