5

我有一些 PC-Lint 给我的代码Error 503: Boolean argument to relational on。这是对模板函数的调用,其定义如下:

template <typename ITypeToUse>
void ShowWindowEx(
    HWND hWnd,
    int nCmdShow,
    ITypeToUse *pControl);

调用本身如下所示:

ShowWindowEx<IActualType>(this->GetWndHandle(), SW_SHOW, m_spControl);

显然,该部分ShowWindowEx<IActualType>(...)被解释为Identifier1 < Identifier2 > Expression... PC-Lint 似乎没有意识到这ShowWindowEx是一个模板函数,它需要尖括号中的类型并尽力将其解释为布尔表达式。

我知道我可以简单地告诉 lint 忽略此行的此错误(尽管实际上它大约有 30 行),但我想防止这种情况再次发生。另外,据我所知,PC-Lint 应该能够处理模板函数调用,知道为什么这里不是这种情况吗?

声明位于标头中的类内部,调用位于该类的另一个成员函数中,该函数在 ShowWindowEx 之前声明。两个成员函数的实现在 .cpp 文件中以相同的顺序发生,因此对 ShowWindowEx 的调用发生在其实现之前。PC-Lint 是否可能只是忽略了标题?

编辑:我现在将函数原型更改为:

template <typename IPointerToUse>
void ShowWindowEx(
    HWND hWnd,
    int nCmdShow,
    IPointerToUse pControl);

所以模板会处理指针类型。感谢 DeadMG 的建议。问题仍然存在,因为我认为上述方法不应该起作用,但它也可以这种方式起作用。

4

2 回答 2

1

503 通常是 C 警告,而不是 C++。是否可以将包含模板函数调用的 C++ 文件视为 Lint 的 C 文件,可能是在 Windows 机器上使用 *.C(大写字母)?还是使用非标准扩展?

我在 Windows PC Lint 安装上使用 Samba 对 Unix C++ 程序进行 Lint 时看到过这种情况。如果这仍然是一个问题,请查看指示模块名称的输出行,如--- Module: ...,并查看括号之间的文件类型。如果关闭,您可能需要使用-vm(默认)。

如果是这种情况,我希望在调用周围会出现更多警告,但是将模板解释<...>为两个比较运算符会合理地引发此警告。

除此之外,您提出的这一行 - 没有上下文 - 没有给出任何理由说明 503 可能适用于此。

于 2012-11-29T10:14:24.287 回答
0

原因可能是 Windows 标头中已经有 ShowWindowEx 的定义(没有模板定义)。也许您应该尝试重命名您的函数。

于 2011-10-04T06:23:02.127 回答