2015-06-02 50 views
0

,在編譯使用與IDE分佈的TeeChart組件下的CBuilder XE8一個項目,我得到的錯誤的長裏姆斯這樣的:不需要W8080警告

[bcc32 Warning] GdiplusStringFormat.h(306): W8058 Cannot create pre-compiled header: initialized data in header 
[bcc32 Warning] MI3Proc.cpp(719): W8080 'Gdiplus::FlatnessDefault' is declared but never used 
[bcc32 Warning] MI3Proc.cpp(719): W8080 'Gdiplus::GenericSansSerifFontFamily' is declared but never used 
[bcc32 Warning] MI3Proc.cpp(719): W8080 'Gdiplus::GenericSerifFontFamily' is declared but never used 
[bcc32 Warning] MI3Proc.cpp(719): W8080 'Gdiplus::GenericMonospaceFontFamily' is declared but never used 
[bcc32 Warning] MI3Proc.cpp(719): W8080 'Gdiplus::GenericSansSerifFontFamilyBuffer' is declared but never used 
[bcc32 Warning] MI3Proc.cpp(719): W8080 'Gdiplus::GenericSerifFontFamilyBuffer' is declared but never used 
[bcc32 Warning] MI3Proc.cpp(719): W8080 'Gdiplus::GenericMonospaceFontFamilyBuffer' is declared but never used 
[bcc32 Warning] MI3Proc.cpp(719): W8080 'Gdiplus::GenericTypographicStringFormatBuffer' is declared but never used 
[bcc32 Warning] MI3Proc.cpp(719): W8080 'Gdiplus::GenericDefaultStringFormatBuffer' is declared but never used 

另據報道這個問題在Steema的支持論壇http://www.teechart.net/support/viewtopic.php?f=3&t=15374,但沒有後續。

我在CBuilder 4下有類似TeeChart的問題(類似20年前!)。嗯。

我不想在項目範圍內關閉W8080警告,因爲它有助於保持我的代碼清潔,但有什麼辦法可以關閉TeeChart單元的警告嗎?

此外,我不知道什麼W8058錯誤。 #pragma hdrstop位於VclTee.TeeGDIPlus.hpp的前面,所以不應出現此錯誤。

編輯: 我發現一些更多的信息是有問題的變量是靜態/ const的全局變量和宣佈,以GdiplusEnums.h和GdiplusHeaders.h(文版權所有2001年由微軟)初始化。

暫時禁用8080警告不起作用,因爲嵌套鏈中的某處包含8080警告被重置爲默認值。如果在調用編譯器(即全局選項)時禁用了8080警告,則所有8080警告都將停止,但您不會發現自己的錯誤。即使將整個CPP單元放在#pragma warn -8080塊中也不會阻止警告!

我發現停止警告(沒有全局禁用8080警告)的唯一方法是在每個受影響的源單元中放置類似這樣的虛擬代碼(以便變量引用)。

void   *pvDummy; 
    double   dDummy; 
    BYTE   *pBYTEDummy; 

    dDummy = Gdiplus::FlatnessDefault; 
    pvDummy = Gdiplus::GenericSansSerifFontFamily; 
    pvDummy = Gdiplus::GenericSerifFontFamily; 
    pvDummy = Gdiplus::GenericMonospaceFontFamily; 
    pBYTEDummy = Gdiplus::GenericSansSerifFontFamilyBuffer; 
    pBYTEDummy = Gdiplus::GenericSerifFontFamilyBuffer; 
    pBYTEDummy = Gdiplus::GenericMonospaceFontFamilyBuffer; 
    pBYTEDummy = Gdiplus::GenericTypographicStringFormatBuffer; 
    pBYTEDummy = Gdiplus::GenericDefaultStringFormatBuffer; 

包含此代碼具有爲處於的#pragma方法警告-8004塊,以避免警告約「XXX被分配是從未使用過的值」。哎呀。使用#pragma warn指令

這確實得罪良好的編碼風格一定意義,但你去那裏...

+0

根據我的經驗,W8058絕不應該在它應該在的地方。這通常意味着在別的地方,你正在聲明一些數據。有些時候,它顯示在默認的字符串參數中,或類似的東西在其他頭文件中工作正常(即不會產生此警告)。我*從未*看到它指出問題出在哪裏,通常甚至不在正確的標題中。您可以嘗試在「罪魁禍首」標題前註釋#includes,看看它是否停止,然後查找擴展常量的實例,至少對我來說通常會導致問題。 –

回答

0

您可以禁用W8080(或其他任何警告)。

我會在產生警告的標題之前添加它,所以你不要修改標題。例如:

#pragma warn -8080 
#include <TheOffendingHeader.h> 
#pragma warn .8080 
+0

使用您建議的方法不起作用,因爲XE8重新插入編譯指示塊外的#include。看到我的OP瞭解一些其他信息。 – EBlake

+0

@EBlake我手頭沒有XE8來嘗試,但是我不太明白編譯器爲什麼或者在哪裏提供它,而不是你要求的地方。你確定你沒有爲該項目使用預編譯頭文件嗎?至少在創建新項目時使用XE5時,通常會爲每個單元開始時自動包含/插入的PCH創建一個標題。 –

+0

我的意思是include由XE管理 - 它是包含在單元頭部開頭的頭文件之一。將組件添加到表單時,XE會自動添加相關的頭文件include。如果你嘗試刪除它們(或者顯然把它們放在一個#pragma塊中),XE會簡單地重新插入它們。有關更多信息,請參閱OP中的編輯。 – EBlake