Интересно. Когда я добавляю -fdiagnostics-show-option к флагам компилятора, чтобы показать, какая опция управляет этим предупреждением, он просто говорит -Wextra. По-видимому, нет способа индивидуально контролировать это предупреждение за пределами -Wextra. Но я могу отключить -Wextra, только когда компилятор просматривает заголовочный файл библиотеки с помощью диагностических прагм. Спасибо!

ользую g ++ версии 4.2.1 с включенным -Wextra. Я включаю заголовок из библиотеки и продолжаю получать следующее предупреждение о классе в библиотеке, который активируется -Wextra (я заменил фактическое имя класса на BaseClass):

warning: base class ‘class BaseClass’ should be explicitly initialized in the copy constructor

У меня вопрос: как я могу отключить это предупреждение? Например, -Wextra также включает -Wuninitialized, но я могу переопределить это просто, передав -Wno-uninitialized в качестве флага компилятора. Есть ли что-нибудь подобное для предупреждения о конструкторе копирования? Я не смог найти ответ на страницах руководства g ++ или в других сообщениях на форуме.

 user58830325 янв. 2011 г., 01:39
Кроме того, этот вопрос касается флагов компилятора и того, как их включать или выключать, так зачем нужен какой-либо код?
 Oliver Charlesworth25 янв. 2011 г., 01:14
Не видя некоторый пример кода, как кто-нибудь может знать?
 Oliver Charlesworth25 янв. 2011 г., 01:15
Обратите внимание, что отключение предупреждения редко является хорошим подходом ...
 user58830325 янв. 2011 г., 01:39
Это предупреждение возможно ненужно. Если в списке инициализации производного класса не указан конструктор базового класса, вызывается конструктор по умолчанию. В этом случае я знаю и понимаю это поведение, поэтому я не хочу, чтобы это предупреждение выводилось (плюс, оно находится в библиотеке, которую я бы не хотел изменять).

Ответы на вопрос(3)

Решение Вопроса

http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html (ищиWextra) это неотъемлемая часть-Wextra и не может быть отключен отдельно (например, отдельно не указан в списке-W опция).

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

Дано:

class BaseClass
{
public:
    BaseClass();
    BaseClass(const BaseClass&);
};

class DerivedClass : public BaseClass
{
public:
    DerivedClass(const DerivedClass&);
};

Этот конструктор копирования:

DerivedClass::DerivedClass(const DerivedClass& obj)
  // warning: no BaseClass initializer!
{
}

На самом деле означает так же, как:

DerivedClass::DerivedClass(const DerivedClass& obj)
  // Default construct the base:
  : BaseClass()
{
}

Вы можете вставить инициализатор конструктора по умолчанию, как описано выше, если это действительно то, что вы имеете в виду, и предупреждение исчезнет. Но компилятор предполагает, что вы, возможно, захотите этого:

DerivedClass::DerivedClass(const DerivedClass& obj)
  // Copy construct the base:
  : BaseClass(obj)
{
}
 user58830325 янв. 2011 г., 01:46
Да, это верно. Но знаете ли вы какой-либо способ отключить только одно предупреждение, оставив все остальные предупреждения включенными -Wextra?
 aschepler25 янв. 2011 г., 18:37
Нет не знаю Это тот случай, когда я много раз предпочел бы исправить код отключению предупреждения.

и вы не можете изменить библиотеку (я думаю, вы не можете или вы бы сделали это), вы можете временно отключить предупреждения, используяGCC диагностическая прагма.

 user58830325 янв. 2011 г., 01:52
Интересно. Когда я добавляю -fdiagnostics-show-option к флагам компилятора, чтобы показать, какая опция управляет этим предупреждением, он просто говорит -Wextra. По-видимому, нет способа индивидуально контролировать это предупреждение за пределами -Wextra. Но я могу отключить -Wextra, только когда компилятор просматривает заголовочный файл библиотеки с помощью диагностических прагм. Спасибо!

Ваш ответ на вопрос