Компоновщик C++ - Отсутствие дублирующихся символов

То, что Вы ищете, является псевдоэлементом, который не существует. Существует: первая буква и: первая строка, но нет: первое слово.

можно, конечно, сделать это с JavaScript. Вот некоторый код, я нашел, что это делает это: http://www.dynamicsitesolutions.com/javascript/first-word-selector/

5
задан Bob Mourlam 16 November 2009 в 18:06
поделиться

3 ответа

Вы нарушаете одно правило определения , и компилятор / компоновщик не обязан сообщать вам об этом.

4
ответ дан 14 December 2019 в 01:10
поделиться

Добрый день,

Это не поведение редактора ссылок по умолчанию, чтобы взять первый символ, который удовлетворяет требованиям, и прекратить поиск.

Вы должны иметь возможность включить полный поиск, чтобы запретить повторяющиеся символы в закрытии исполняемого файла.

Edit: Я только что видел, что редактор ссылок в Solaris запрещает использование нескольких определений по умолчанию. На самом деле вам нужно использовать переключатель редактора ссылок "-z muldefs", чтобы разрешить связывание с несколькими определениями в объектах, используемых для закрытия исполняемого файла.

Edit2: Я заинтригован здесь, так как это должно быть быть помеченным как предупреждение. Что произойдет, если вы добавите

-std=c++98 -pedantic-errors

в командную строку при сборке исполняемого файла?

3
ответ дан 14 December 2019 в 01:10
поделиться

Другие уже говорили о Правиле одного определения, я подумал, что хотел бы дать какое-то объяснение и реальный обходной путь.

Объяснение :

Я не буду объяснять Одно правило определения, но я объясню, почему компоновщик не жалуется. Когда вы используете шаблоны, каждый объект получает свой собственный экземпляр std :: vector . Компоновщик просто выбирает первый доступный.

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

Решение :

Поскольку я в основном предполагаю, что вы пытаетесь реализовать указатель на реализацию, у вас нет особого выбора, кроме пересылки.

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

namespace detail { class FooImpl; }

class Foo
{
  typedef detail::FooImpl Impl; // note that the typedef is private
  Impl* m_impl;
};

Простой и эффективный. Я всегда использую деталь для деталей реализации и просто добавляю Impl в конец имени класса, который должен быть Impl .

Примечания :

  • Жаль, что вы не можете просто пересылать объявление об этом в классе, но мы ничего не можем с этим поделать.
  • Детали пространства имен предотвращают загрязнение основного пространства имен, в котором вы занимаетесь живет с этими символами, что особенно удобно для автозаполнения в среде IDE, поскольку в противном случае вы получили бы как предложения Foo , так и FooImpl .
2
ответ дан 14 December 2019 в 01:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: