Деактивирайте предупреждението на определено място в Intel Compiler

Имам математически вектор, чиито размери определям с параметър на шаблона 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 предупреждение (деактивиране: номер)'. И двамата имат 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)


Както беше казано, можете да деактивирате предупрежденията със специфични за компилатора #pragmas. Досадното на това решение е, че не е преносимо и някои компилатори издават предупреждения, когато намерят други компилатори #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

Както предложи Jarod42, можете да използвате #pragmas, за да игнорирате предупреждения на определени места и е споменат прост пример тук.

person SKPS    schedule 30.08.2013