我有一个数学向量,我用模板参数
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 并不明智,尽管我仍然可以在其他地方犯一个真正的错误;我只想在该代码区域禁用它。
感谢您的努力。
正如前面所说,您可以使用编译器特定的
#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