C 确保不良模式不会出现';重构之后,我们不会回来

C 确保不良模式不会出现';重构之后,我们不会回来,c,static-analysis,C,Static Analysis,我正在重构一个旧的C代码。代码完全没有分层架构(所有东西都被所有东西访问),我正试图改变这一点 我想减少对结构成员的直接访问(至少现在是写),只允许通过访问函数进行访问。有什么工具(或者直接是编译器)可以帮我检查这个规则吗 我需要这个,因为我正在维护一个fork,而上游并不十分关心代码质量。我认为您可以使用或与eclipse IDE一起使用。在这两个工具中,您都可以配置自己的规则。我认为您可以使用或与eclipse IDE配合使用。在这两个实用程序中,您可以配置自己的规则。确保没有新代码直接访问

我正在重构一个旧的C代码。代码完全没有分层架构(所有东西都被所有东西访问),我正试图改变这一点

我想减少对结构成员的直接访问(至少现在是写),只允许通过访问函数进行访问。有什么工具(或者直接是编译器)可以帮我检查这个规则吗


我需要这个,因为我正在维护一个fork,而上游并不十分关心代码质量。

我认为您可以使用或与eclipse IDE一起使用。在这两个工具中,您都可以配置自己的规则。

我认为您可以使用或与eclipse IDE配合使用。在这两个实用程序中,您可以配置自己的规则。

确保没有新代码直接访问结构的最佳方法是不使用完全封装使它们可用。这是以无法再使用堆栈上的结构为代价的。您提供一个函数来分配结构,另一个函数来释放结构,所有模块函数都接受指向结构的指针。但是,结构本身的定义在C文件中,而不是头文件中。另一个缺点是,您可能需要编写大量函数来操作/查询结构

我将提供使用这种方法的旧代码库中的代码片段。标题包含:

#ifndef INC_QUEUE_H
#define INC_QUEUE_H

typedef enum {
    QUE_OK,
    QUE_BAD_PARAM,
    QUE_NO_MEMORY,
    QUE_SYS_ERROR
} QUE_RV;

typedef struct Queue_st Queue_t;

QUE_RV QUE_New(Queue_t **ppQueue);
QUE_RV QUE_Put(Queue_t *pQueue, int priority, void *pData);
QUE_RV QUE_Get(Queue_t *pQueue, int *priority, void **ppData);
void QUE_Free(Queue_t *pQueue);

#endif /* INC_QUEUE_H */
C文件定义了队列的结构和功能的实现(经过大量修改以突出显示方法):

另一种方法是使用
typedef struct StructName*StructHandle
,并将API中的所有指针替换为
StructHandle
。少了一个要担心的
*


编辑:如果您希望某些成员可见,而某些成员不可见,也可以使用上述方法的扩展。在标题中,定义:

typedef struct StructPriv StructPriv;

typedef struct {
    /* public members go here */

    StructPriv *private;
} Struct;

Struct *STRUCT_Create();
void STRUCT_Free();

在C文件中,定义私有成员以及操作它们的函数。

确保没有新代码直接访问结构的最佳方法是不使用完全封装使它们可用。这是以无法再使用堆栈上的结构为代价的。您提供一个函数来分配结构,另一个函数来释放结构,所有模块函数都接受指向结构的指针。但是,结构本身的定义在C文件中,而不是头文件中。另一个缺点是,您可能需要编写大量函数来操作/查询结构

我将提供使用这种方法的旧代码库中的代码片段。标题包含:

#ifndef INC_QUEUE_H
#define INC_QUEUE_H

typedef enum {
    QUE_OK,
    QUE_BAD_PARAM,
    QUE_NO_MEMORY,
    QUE_SYS_ERROR
} QUE_RV;

typedef struct Queue_st Queue_t;

QUE_RV QUE_New(Queue_t **ppQueue);
QUE_RV QUE_Put(Queue_t *pQueue, int priority, void *pData);
QUE_RV QUE_Get(Queue_t *pQueue, int *priority, void **ppData);
void QUE_Free(Queue_t *pQueue);

#endif /* INC_QUEUE_H */
C文件定义了队列的结构和功能的实现(经过大量修改以突出显示方法):

另一种方法是使用
typedef struct StructName*StructHandle
,并将API中的所有指针替换为
StructHandle
。少了一个要担心的
*


编辑:如果您希望某些成员可见,而某些成员不可见,也可以使用上述方法的扩展。在标题中,定义:

typedef struct StructPriv StructPriv;

typedef struct {
    /* public members go here */

    StructPriv *private;
} Struct;

Struct *STRUCT_Create();
void STRUCT_Free();

在C文件中,定义私有成员和操作它们的函数。

可以使用以前由我来支持的工具,或者这只是针对C++和开源的。p>


可以使用TCL编写自己的规则。< /P> < P>您可以使用以前由我来支持的工具,或者这只是针对C++和开源软件。p>


您可以使用Tcl编写自己的规则。

重命名结构,所有编译错误都是直接访问。:)您是否愿意导致代码中断,并将其作为一种指示,提请您注意坏模式又回来了?我能想到的是一个成语。“我正在写一个描述成语的答案,但你的措辞很好。在我的评论中,我只是半开玩笑:重命名,查找错误以转换/修复代码,然后重新命名。可怜人的重构工具,我用过一次。@Dymaster:事实上,所以鼓励你继续写一篇习语的描述,因为这样你将以最有用的形式向提问者呈现信息。维基百科的内容不适合ASKER的特殊情况,外部链接的内容不总是可检索或永久性的。您要求C++私有成员?重命名结构,所有编译错误都是直接访问。您是否愿意导致代码中断,并将其作为一种指示,提请您注意坏模式又回来了?我能想到的是一个成语。“我正在写一个描述成语的答案,但你的措辞很好。在我的评论中,我只是半开玩笑:重命名,查找错误以转换/修复代码,然后重新命名。可怜人的重构工具,我用过一次。@Dymaster:事实上,所以鼓励你继续写一篇习语的描述,因为这样你将以最有用的形式向提问者呈现信息。维基百科的内容并不适合询问者的特定情况,外部链接的内容并不总是可检索或永久的。您是在请求C++私有成员?@ LeTejava Mebe这些在Java开发中广泛使用的实用工具,但是您也可以将这些实用工具用于CPP。@ LeTeMeYbe是java开发中广泛使用的这些实用工具,但您也可以使用这些工具来进行CPP。