0

我有一个数学向量,我用模板参数定义了它的维度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 并不明智,尽管我仍然可以在其他地方犯下真正的错误;我只想为这个代码区域禁用它。

感谢您的任何努力。

4

2 回答 2

1

如前所述,您可以使用特定于编译器#pragma的 s 禁用警告。这个解决方案的烦人之处在于它不可移植,并且一些编译器在找到其他编译器时会发出警告#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);
}
于 2013-08-30T11:20:23.583 回答
1

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

于 2013-08-30T10:50:16.903 回答