2015-06-02 51 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