предупреждение #pragma не подавляет предупреждение

#c #visual-c #visual-studio-2008 #c-preprocessor #pragma

#c #visual-c #visual-studio-2008 #c-препроцессор #pragma

Вопрос:

Один из моих файлов .cpp генерирует предупреждение C4275 из-за стороннего заголовка I #include … (предупреждение срабатывает из-за класса экспорта DLL, наследуемого от класса, отличного от класса экспорта DLL, насколько я могу судить).

Я добавил строку:

 #pragma warning(disable : 4275)
  

Как первая строка моего .cpp-файла, и все же предупреждение все еще генерируется. Это на VC 2008, и никакой PCH не используется.

Почему мой #pragma не работает, и (кроме изменения стороннего кода) как я могу решить эту проблему?

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

1. есть ли шанс, что вы используете openmp? (единственное место, где я когда-либо видел / использовал #pragma)

Ответ №1:

Создайте предварительно обработанный файл, и вы, вероятно, обнаружите, что какой-то другой файл заголовка повторно активирует предупреждение.

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

1. Чтобы избежать некоторых разочарований: в Visual Studio 2005 и 2012 использование флага /P приводит к игнорированию предупреждающей прагмы, например, /P /D "NOMINMAX" и #pragma warning(disable:4005) #define NOMINMAX выдает предупреждение C4005.

Ответ №2:

Я не видел этого конкретного предупреждения, но в Visual Studio вы можете отключить определенные предупреждения с помощью свойств проекта (т. Е. Не pragma). Отключение их таким образом кажется «более сильным», чем отключение их с помощью pragma. Вы могли бы сделать это только для одного файла, который вы используете.

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

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

1. Это тоже не работает. В моем случае я обнаружил, что подтасовка #includes привела к исчезновению предупреждения — на этот раз — но я все еще задаюсь вопросом, при каких обстоятельствах #pragma это не работает.

Ответ №3:

На случай, если кто-то наткнется на это в случае, подобном моему:

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

Пример:

 // Disable the warning for size_t to int conversion which would cause a problem on 
// 64 bit systems if the first container had more than 2^32 elements. Disabling it 
// here is considered safe since it is impossible for the source container used in 
// this class ever have that many elements.
#pragma warning(disable : 4267)
#include <myLib/myTemplateDefs.h>
#pragma warning(default : 4267)

// Code which uses the template goes here
  

В нашем случае это было приемлемым решением, поскольку в контейнерах хранились имена столбцов таблиц базы данных.