4

当我尝试使用赋值运算符而不是深度复制复制包含指针的结构时,是否有任何 GCC 警告警告?

4

2 回答 2

4

答案是不。请参阅 gcc警告选项列表。

给定相同的页面,警告是:

警告是诊断消息,它们报告本质上不是错误但有风险或暗示可能存在错误的构造。

浅拷贝而不是深拷贝既没有风险也没有错误,因为它可能是一种预期的行为。所以没有理由存在这样的警告选项。

您可能想要的是一个静态分析器,例如clang's one,但据我所知,这个分析器不提供那种功能。

于 2012-11-30T07:26:10.040 回答
1

我记得正好看到这样的警告-Weffc++

当然,您必须愿意在 c++ 模式下进行编译。(见下文)

编辑我对其进行了测试:遗憾的是,这不会警告 POD(即)C 类型。这是测试:

struct HasPointer
{
    int* resource;
    HasPointer() {};
    ~HasPointer() {};
};

编译

E:\mingw64>g++ test.c -Weffc++

输出

test.c:1:8: warning: 'struct HasPointer' has pointer data members [-Weffc++]
 struct HasPointer
        ^
test.c:1:8: warning:   but does not override 'HasPointer(const HasPointer&)' [-Weffc++]
test.c:1:8: warning:   or 'operator=(const HasPointer&)' [-Weffc++]
test.c: In constructor 'HasPointer::HasPointer()':

但是将 ctor/dtor 排除在外,甚至不会发出警告,因此此选项不适用于您的代码,即使在 C++ 编译模式下也是如此


在 C++ 模式下编译 C 代码:

(使用extern "C")实现二进制互操作。它通常很简单

extern "C" 
{
#    include "my.h"
#    include "stuff.h"

// ... 
}
于 2012-11-30T07:29:25.493 回答