在添加detailed answer時,我注意到在Visual C++抱怨時,GCC不會警告以下代碼。爲什麼GCC接受std :: strrchr()返回的值從'const char *'轉換爲'char *'?
#include <cstring>
int main()
{
const char CONSTSTR[] = "foo/bar/foobar.txt";
char *nonconst = std::strrchr (CONSTSTR, '/');
// cannot convert from 'const char *' to 'char *'
*nonconst++ = 'B';
*nonconst++ = 'A';
*nonconst++ = 'D';
}
我已經測試了三個不同版本的GCC:在Red Hat(Linux)的
- 4.1.2 Windows)
但是所有這三個GCC版本都沒有任何警告/錯誤編譯了這段代碼:
> g++ -Wall -Wextra -pedantic -ansi test.cpp && echo "success"
success
儘管微軟編譯器V16抱怨:
> cl -c test.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
test.cpp
test.cpp(5) : error C2440: 'initializing' : cannot convert from 'const char *' to 'char *'
Conversion loses qualifiers
(從我的辦公室,我沒有獲得ideone /鍵盤/ ...使用其他版本進行測試)
由於這代碼使用std::strrchr,我不明白爲什麼海灣合作委員會不抱怨。
const char* strrchr(const char* str, int ch); //the code above uses this declaration
char* strrchr( char* str, int ch);
我的問題:爲什麼G ++成功編譯此代碼沒有任何警告/錯誤?這是一個錯誤嗎?一個特徵?我身邊的小姐配置?
奇怪... gcc 4.7.2 http://ideone.com/7rcwVE錯誤'錯誤:無效轉換從'const char *'到'char *'[-fpermissive]'但是gcc 4.3.2 http:/ /ideone.com/fDdZ08沒有錯誤。舊的編譯器錯誤?你可以嘗試'g ++ -Wall -Wextra -pedantic -ansi file.cpp'(或這些選項的子集)嗎? –
那麼問題是什麼?另外,我的GCC版本(4.6.3)確實會給出預期的錯誤。 –