-1

我有一個數學向量,其尺寸由模板參數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完全不會很聰明,儘管我仍然可以在別處做一個真正的錯誤;我只是想在這段代碼中禁用它。

謝謝你的努力。

+3

gcc使用'#pragma GCC診斷類型選項'。 msvc使用'#pragma warning(disable:number)'。他們都有推/流行在特定區域工作。我不知道icc是使用其中的一種還是使用它自己的語法。 – Jarod42

+0

爲什麼不傳遞一個大小爲「N」而不是N個參數的數組? – Mario

+0

@Mario,因爲用戶將無法直接輸入元素,這正是我所需要的。 –

回答

1

如前所述,您可以通過編譯器特定#pragma s禁用警告。這種解決方案令人討厭的是它不是可移植的,並且一些編譯器在發現其他編譯器#pragma s時發出警告。所以你最終只是交易警告。

您可以修復又一#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); 
} 
+0

如果您不介意,您是否知道預處理器命令來檢查intel編譯器?我找不到它!謝謝。 –

+0

@SamerAfach我不熟悉國際刑事法院,但從[這裏](http://software.intel.com/sites/products/documentation/hpc/composerxe/en-us/2011Update/cpp/lin/bldaps_cls/cppug_ccl/ bldaps_macros_lin.htm)我會說'__ICC'。另見[this](http://sourceforge.net/p/predef/wiki/Compilers/) –

+0

非常感謝你;我找到了。它是「__INTEL_COMPILER」。乾杯! –

1

由於Jarod42建議您可以使用#pragmas忽略特定位置的警告,並提到簡單示例here