Вызывает ли конфликт между объявлением и определением неопределенное поведение? - PullRequest
0 голосов
/ 27 ноября 2018

Например, в одном исходном файле:

extern int a[10];
int main()
{
   (void)sizeof(a);
   return 0;
}

и во втором исходном файле мы имеем:

int a[20];//different with the first source 

Вызывает ли приведенный выше код неопределенное поведение ?Насколько я знаю, в C говорится:

Все объявления, которые ссылаются на один и тот же объект или функцию, должны иметь совместимый тип;в противном случае поведение не определено.

Совместимы ли int[10] и int[20] (с точки зрения c)?А как насчет C ++ стандарта?

Кроме того, если нет второго исходного файла, допустимо ли использовать sizeof(a) (a имеет только объявление)?

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

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

Другие реализации, особенно те, которые используют оптимизацию всей программы, могут обрабатывать символы, которые экспортируются из одного модуля компиляции C и используются другим способом, отличным от того, что предлагал бы ABI, особенно если это позволило бы сделать вещи более эффективными, илипозволяют системе сборки производить лучшую диагностику.

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

0 голосов
/ 27 ноября 2018

Да, это неопределенное поведение в C, они несовместимы, см. C11 6.7.6.2, описатели массива, параграф 6

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

и неправильно сформированы никакие диагностические данные, требуемые в C ++ от [basic.link] p11 :

После всех корректировок типов (во время которых typedefs заменяются их определениями), типы, указанные во всех объявлениях, ссылающихся на данную переменную илиФункция должна быть идентичной, за исключением того, что объявления для объекта массива могут указывать типы массивов, которые отличаются наличием или отсутствием привязки основного массива ([dcl.array]).Нарушение этого правила для идентификации типа не требует диагностики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...