Предупреждение C4503 при использовании «#pragma warning» вокруг Boost включает - PullRequest
1 голос
/ 12 марта 2012

Я получаю предупреждение C4503 («длина украшенного имени превышена, имя было усечено», 3 раза) при компиляции следующего кода C ++ в VS 2010 с Boost 1.4.9:

#include <vector>
#include <map>

#pragma warning (push, 1)
#include <boost/units/quantity.hpp>
#include <boost/units/si/plane_angle.hpp>
#pragma warning (pop)

using namespace boost::units;

typedef std::pair<quantity<si::plane_angle>, quantity<si::plane_angle> > Section;

std::vector<Section> getEmptyVector()
{
    std::vector<Section> sections;
    return sections;
}

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

Ответы [ 3 ]

2 голосов
/ 12 марта 2012

Похоже, это предупреждение, которое ребята из буста решили подавить для компилятора Visual C ++.

С здесь :

Предупреждение: превышена длина украшенного имени C4503
Предложения: Подавить. (Обратите внимание, что \ boost \ config \ compiler \ visualc.hpp включает это глобальное> подавление ...)! Подавление: предупреждение #pragma (отключить: 4503)

Теперь для компилятора. Обратите внимание на следующий код:

#pragma warning (push, 1)
#pragma warning (disable:4503)

// C4503.cpp
// compile with: /W1 /EHsc /c
// C4503 expected
#include <string>
#include <map>

class Field{};

typedef std::map<std::string, Field> Screen;
typedef std::map<std::string, Screen> WebApp;
typedef std::map<std::string, WebApp> WebAppTest;
typedef std::map<std::string, WebAppTest> Hello;
Hello MyWAT;

#pragma warning (pop)

Я только что подправил пример справки Microsoft для этого предупреждения

если вы поставите #pragma warning (disable:4503) после толчка, вы получите предупреждение. Если вы поставите его до , появится нет предупреждений. Это означает, что приведенный выше код генерирует предупреждения C4503, даже если он был отключен.

1 голос
/ 12 марта 2012

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

0 голосов
/ 13 ноября 2013

Правильный ответ на этот вопрос можно найти в документации MSDN :

Прагма-предупреждение (pop) выводит последнее состояние предупреждения, помещенное в стек. Любые изменения, внесенные вами в состояние предупреждения между push и pop, отменяются.

Любые изменения состояния предупреждения между push и pop отменяются. Это означает, что любые изменения, которые вносят сами буст-заголовки (и, по-видимому, они отключают 4503), отменяются. Вы можете восстановить отключение 4503 после всплывающего окна.

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