Почему MSVC10 игнорирует мое предупреждение #pragma (отключено: 4251)? - PullRequest
2 голосов
/ 22 декабря 2011

Таким образом, предупреждение 4251 является серьезной основой как минимум компилятора Microsoft.По сути, всякий раз, когда вы используете класс шаблона или класс не dllexport где-либо в определении заголовка, вы получите это предупреждение.Более того, в stl (например, map) есть множество классов, где вы даже не можете избавиться от этой ошибки, точка.

Моя проблема в том, что для определенного класса выдается предупреждение "#pragma (disable: 4251) "просто не работает.Он работает везде, но не здесь.

DelWestInspectionProgram.cpp

#include "stdafx.h"
#pragma warning(disable: 4251)
...

Output Log:
E:\svn\VisionNow\VisionSuite\VI.Inspector.ImageProcessing.Common\BIImage.h(79): warning       C4251: 'BIImage::_data' : class 'boost::shared_array<T>' needs to have dll-interface to be   used by clients of class 'BIImage'
6>          with
6>          [
6>              T=unsigned char
6>          ]
6>E:\svn\VisionNow\VisionSuite\VI.Inspector.ImageProcessing.Operators\BIImageOperator.h(25): warning C4251: 'BIImageOperator::_savePath' : class 'std::basic_string<_Elem,_Traits,_Ax>' needs to have dll-interface to be used by clients of class 'BIImageOperator'
6>          with
6>          [
6>              _Elem=char,
6>              _Traits=std::char_traits<char>,
6>              _Ax=std::allocator<char>
6>          ]

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

2 голосов
/ 11 октября 2012

Из моего собственного опыта есть две проблемы: когда это импорт DLL и когда это экспорт DLL.

  1. Где это dllexport, Microsoft, похоже, игнорирует предупреждение #pragma, но это всего лишь один проект, который так легко вставить в настройки компилятора, чтобы игнорировать это предупреждение. Я нашел, если вы положите его туда, Microsoft не выдает предупреждение.

  2. Где это dllimport, то есть файл, использующий ваш заголовок. Я обнаружил, что Microsoft не игнорирует прагму и не выдает предупреждение, поэтому размещение ее в обоих местах решит вашу проблему.

Я предполагаю, что 79 проектов, которые подавляют предупреждение, являются теми, которые не являются самой DLL.

  1. Предупреждение, вероятно, есть по той причине, что если ваша клиентская библиотека использует другую версию boost или даже другую настройку компилятора, она может сломаться.
0 голосов
/ 22 декабря 2011

Насколько я знаю, некоторые ошибки нельзя отключить.Именно так с линкером.Поэтому я бы предположил, что то же самое с некоторым компилятором тожеНо в целом я бы поместил его в ваш файл stdafx.h или, по крайней мере, перед этим.После этого ничего не гарантируется, тем более что мы не можем видеть ваш код.

[EDIT]

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

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