2013-10-06 33 views
8

我試圖編譯使用g一些C++代碼(是的,故意的)。我得到這樣的錯誤(例如):如何抑制警告,「無效*」到「富*」轉換(由-fpermissive從錯誤中減少)

error: invalid conversion from 'void*' to 'unsigned char*' [-fpermissive] 

添加-fpermissive的編譯選項打動了我:

error: invalid conversion from 'void*' to 'unsigned char*' [-Werror=permissive] 

這似乎是一個錯誤,因爲-Werror,但是加入-Wno-error=permissive -Wno-permissive結果:

error: -Werror=permissive: no option -Wpermissive 
error: unrecognized command line option "-Wno-permissive" [-Werror] 

如何禁用從void *轉換爲其他指針類型的警告(globaly)?

+4

您可以修復編譯器或者您可以修復您的代碼,1989年很久以前。通過在你的代碼中寫入一個明確的(強制轉換)來實現前進 –

+2

抑制錯誤不會使錯誤消失。毫無意義的是,你要將C編譯爲C++,然後抱怨說你沒有有效的C++。如果你想將它編譯爲C++,那麼將它轉換爲有效的C++,或者將它編譯爲C. –

+2

(好吧,顯然stackoverflow重新排列標籤;現在刪除'C++')。我特別感興趣*告訴'g ++' (不是任何隨機的C++實現)來忽略這些警告,以及相當於''-Wno- ''是'寬容'的。 –

回答

7

你不能「禁止從void*到其他指針類型轉換的警告」,因爲這不是一個警告 - 這是一個語法錯誤。

這裏發生的事情是,你正在使用-fpermissive該降級的一些錯誤 - 包括這一個 - 到警告,因此可以讓你編譯一些不符合規定的代碼(顯然很多類型的語法錯誤,如缺少括號,不能降級爲警告,因爲編譯器無法知道如何修復它們以將它們變成可理解的代碼)。

然後,您還使用-Werror將所有警告升級爲錯誤,包括-fpermissive已將錯誤轉化爲的「警告」。

-Wno-error僅用於否定-Werror,即它會導致-Werror治療所有警告視爲錯誤除了-Wno-error指定的警告,其保持爲警告。由於-W標誌表明,這兩個標誌與警告工作,所以他們無法與這一具體問題做任何事情,因爲你這裏有什麼是錯誤。對於這種無效轉換,沒有「警告」,您可以使用-Werror關閉並打開它,因爲它不是真正的警告 - 這是-fpermissive僅僅導致被視爲警告的錯誤。

可以編譯你的非comforming代碼,在此情況下,通過不使用使用-Werror-fpermissive。這仍然會給你一個警告,但是像所有警告一​​樣,它不會阻止編譯成功。如果您故意嘗試編譯不符合的代碼,則使用-Werror是沒有意義的,因爲您知道代碼包含錯誤並因此會導致警告,即使使用-fpermissive,因此指定-Werror等同於說「請不要編譯我的不符合要求的代碼,儘管我只是要求你。「

你可以去得到g ++來抑制警告的最遠的地方是使用-fsyntax-only,它將檢查語法錯誤而不是其他任何東西,但是因爲你在這裏有一個語法錯誤,那對你沒有任何幫助,而且最好的你可以做的就是變成-fpermissive的警告。

+1

準確地說,這種轉換在語義上是不正確的,而不是語法上的,例如,缺少大括號或現在保留的標識符。 – user3125367

1

如何禁用從void *到 其他指針類型轉換的警告(globaly)?

那麼它可能需要使用編譯器的代碼直接互動。這可能不是你想要的。你想修復你的代碼。首先,這些不是警告,但是錯誤。你需要投void*因爲你不能一個void*轉換成任何東西,而不第一投射(它是可能的但Ç是類型安全的,因爲C++是)。

例如,你需要做的

void* buffer = operator new(100); 
unsigned char* etherhead = static_cast<unsigned char*>(buffer); 
           ^
           cast 

如果你想100 unsigned char一個動態分配的緩衝區,那麼你最好這樣做

unsigned char* p = new unsigned char[100]; 

,避免了演員。

void pointers

+3

+1可能應該注意的是,這是使用C++編譯器編譯C代碼時發生的情況。與學術界教授的內容相反,人們並不是一個包羅萬象的子集。 (並使用'static_cast (buffer)',btw。) – WhozCraig

+0

@WhozCraig確實。實際上,我有一位學者不僅向我提出這一要求,而且還以C++標準的虛假引用作爲支持,當然這種說法在現實中恰恰相反。 – EJP

+1

實際上,如果源代碼是C,那麼他將擁有一個malloc()而不是任何新的。 C和C++之間的另一個*小*差異。 –

相關問題