Отключить предупреждение в определенном месте в компиляторе Intel

У меня есть математический вектор, размеры которого я определяю с помощью параметра шаблона int N. Проблема в том, что я добавляю ко многим параметрам в конструкторе до N = 9, g ++ с этим все в порядке, но компилятор Intel жалуется на это с предупреждением

предупреждение # 175: индекс вне допустимого диапазона

Да, нижний индекс находится вне допустимого диапазона, но нет, это не вызовет проблемы, потому что он написан так:

template <int N, typename T>
Vector<N,T>::Vector(T val0, T val1, T val2, T val3, T val4, T val5, T val6, T val7, T val8, T val9)
{
    for(int i = 0; i < N; i++)
    {
        _values[i] = T();
    }
    _values[0] = val0;
    if(N > 1)
        _values[1] = val1;
    if(N > 2)
        _values[2] = val2;
    if(N > 3)
        _values[3] = val3;
    if(N > 4)
        _values[4] = val4;
    if(N > 5)
        _values[5] = val5;
    if(N > 6)
        _values[6] = val6;
    if(N > 7)
        _values[7] = val7;
    if(N > 8)
        _values[8] = val8;
    if(N > 9)
        _values[9] = val9;
}

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

Возникает вопрос: как я могу сказать компилятору с помощью чего-то вроде макроса / команд предварительного компилятора, что он не должен выдавать предупреждение № 175 для этих строк? Заметьте, что полностью отключить предупреждение № 175 было бы неразумно, хотя я все равно мог бы сделать настоящую ошибку где-нибудь еще; Я просто хочу отключить его для этой области кода.

Спасибо за любые усилия.


person The Quantum Physicist    schedule 30.08.2013    source источник
comment
gcc использует параметр #pragma GCC для диагностики. msvc использует предупреждение #pragma (disable: number). У них обоих есть push / pop для работы в определенном регионе. Я не знаю, использует ли icc один из них или свой собственный синтаксис.   -  person Jarod42    schedule 30.08.2013
comment
почему бы не передать массив размером N вместо N параметров?   -  person Mario    schedule 30.08.2013
comment
@Mario, потому что пользователь не сможет вводить элементы напрямую, что я и ищу.   -  person The Quantum Physicist    schedule 30.08.2013


Ответы (2)


Как уже было сказано, вы можете отключить предупреждения с помощью #pragma, специфичных для компилятора. Раздражает то, что это решение не переносимо, и некоторые компиляторы выдают предупреждения, когда находят другой компилятор #pragmas. Таким образом, вы получаете просто торговые предупреждения.

Вы можете решить эту проблему с помощью еще одного #pragma или защитить прагмы с помощью

#ifdef SOME_MACRO_DEFINED_BY_COMPILER_A
#pragma SOME_PRAGMA_FOR_COMPILER_A
#endif

#ifdef SOME_MACRO_DEFINED_BY_COMPILER_B
#pragma SOME_PRAGMA_FOR_COMPILER_B
#endif

Я бы предпочел убедиться, что компилятор не видит код, который может вызвать это предупреждение. Я бы сделал что-нибудь (не тестировалось), например:

template <int i>
typename std::enable_if<(i < N)>::type
set(const T& val) {
    _values[i] = val;
}

template <int i>
typename std::enable_if<(i >= N)>::type
set(const T&) {
}

Vector(T val0, T val1, T val2, T val3, T val4, T val5, T val6, T val7, T val8, T val9) {
    for(int i = 0; i < N; i++)
    {
        _values[i] = T();
    }
    _values[0] = val0;
    set<1>(val1);
    set<2>(val2);
    set<3>(val3);
    set<4>(val4);
    set<5>(val5);
    set<6>(val6);
    set<7>(val7);
    set<8>(val8);
    set<9>(val9);
}
person Cassio Neri    schedule 30.08.2013
comment
Если вы не возражаете, знаете ли вы команду препроцессора для проверки компилятора Intel? Я не мог его найти! Спасибо. - person The Quantum Physicist; 30.08.2013
comment
@SamerAfach Я не знаком с ICC, но из здесь Я бы сказал __ICC. См. Также это - person Cassio Neri; 30.08.2013
comment
Большое Вам спасибо; Я нашел это. Это __INTEL_COMPILER. Ваше здоровье! - person The Quantum Physicist; 30.08.2013
comment
Кстати ... в компиляторе Intel есть ужасная ошибка ... Этого нельзя сделать, отключив и снова включив предупреждения ... software.intel.com/en-us/forums/topic/283633 - person The Quantum Physicist; 30.08.2013

Как предложил Джарод42, вы можете использовать #pragmas, чтобы игнорировать предупреждения в определенных местах, и упомянут простой пример здесь.

person SKPS    schedule 30.08.2013