2015-09-21 6 views
1

Я читал около One Definition Rule. В нем говорится, что:C++ путаница об одном правиле определения

если один .cpp-файл определяет struct S {int x; }; и другой .cpp-файл struct S {int y; };, поведение программы, которая связывает , вместе не определено. Обычно это разрешается с помощью именных пространств имен .

Я не понимаю, почему & как это не определено? Кто-нибудь объяснит мне фактическую причину этого? Как это разрешено с неназванными пространствами имен?

+1

Вы объявляете одну и ту же структуру двумя разными способами, так что две разные части кода видят ее по-разному. По общему признанию, изменение только имен, но сохранение типов одинаково, вероятно, будет работать на большинстве компиляторов C++ сегодня, но spec guarentees ничего. –

+5

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

ответ

4

Это так, как говорится. Вы дважды определили один класс S с разными определениями. Создатели языка заявили, что вы не сделаете этого. Причина в том, что разрешение было бы явно бессмысленным и приводило к нарушению совместимости между вашими единицами перевода. Какое определение является «правильным»? Какой должен использовать ваш компилятор?

An результаты безымянного пространства имен в этих двух определениях фактически определяющих различных классов S, которые должным образом с именем что-то похожим на my-anonymous-namespace-1::S и my-anonymous-namespace-2::S, хотя вы никогда не можете относиться к ним так, потому что пространство имена, ну, анонимные.

+0

Спасибо. Это имеет смысл – Destructor

 Смежные вопросы

  • Нет связанных вопросов^_^