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

问题描述 投票:0回答:2

我有一个数学向量,我用模板参数

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 并不明智,尽管我仍然可以在其他地方犯一个真正的错误;我只想在该代码区域禁用它。

感谢您的努力。

c++ compiler-errors intel compiler-warnings icc
2个回答
2
投票

正如前面所说,您可以使用编译器特定的

#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



1
投票
here

© www.soinside.com 2019 - 2024. All rights reserved.