在英特尔编译器中的特定位置禁用警告

时间:2013-08-30 10:22:24

标签: c++ compiler-construction compiler-errors compiler-warnings intel

我有一个数学向量,我用模板参数int N定义了它的维度。问题是我在构造函数中添加了很多参数,最多N = 9,g ++就可以了,但是英特尔编译器抱怨这个带有警告

警告#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是数据类型。因此,英特尔编译器不够聪明,不会意识到这不会导致任何问题,因为除非索引有效,否则我不访问该元素。

问题是:如何告诉编译器类似宏/预编译器命令,它不应该为这些行发出警告#175?请注意,完全禁用警告#175并不聪明,尽管我仍然可以在其他地方执行真正的错误;我只想为这段代码禁用它。

感谢您的任何努力。

2 个答案:

答案 0 :(得分:1)

正如Jarod42建议您可以使用#pragmas忽略特定位置的警告,并提到了简单示例here

答案 1 :(得分:1)

如前所述,您可以使用编译器特定的#pragma来禁用警告。这个解决方案的烦人之处在于它不可移植,并且一些编译器在找到其他编译器#pragma时会发出警告。所以你最终只是交易警告。

您可以使用另一个#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);
}