struct数据类型在.c文件中定义,并在头文件中使用,而正常情况必须相反[重复]

qacovj5a  于 2023-02-18  发布在  其他
关注(0)|答案(1)|浏览(124)
    • 此问题在此处已有答案**:

(13个答案)
7天前关闭。
结构数据类型的定义应该在头文件中,而不是相反。这是我的理解,而这个项目在这个特殊的情况下做相反的事情。是什么驱使贡献者决定这样做,为什么?我知道这是一个设计决定,但我应该提交一个直接的问题给代码贡献者吗?我正在看GNU masscan项目,并引起了我的注意,两个文件的事件超时。c,它具有结构数据类型的定义

struct Timeouts {
    /**
     * This index is a monotonically increasing number, modulus the mask.
     * Every time we check timeouts, we simply move it foreward in time.
     */
    uint64_t current_index;

    /**
     * The number of slots is a power-of-2, so the mask is just this
     * number minus 1
     */
    unsigned mask;

    /**
     * The ring of entries.
     */
    struct TimeoutEntry *slots[1024*1024];
};

虽然在头文件event-timeout. h中包含以下语句,用于导入"Timeouts"结构数据类型

struct Timeouts;
struct Timeouts *timeouts_create(uint64_t timestamp_now);

我不知道为什么头文件中没有定义结构超时?

tquggr8v

tquggr8v1#

  1. C鼓励将接口和类型声明放在头文件中,并实现.c文件。struct可能会泄漏您希望隐藏的实现细节(以使更改更容易甚至可能)。为此,您只需将struct的前向声明(可选地公开为typedef structtypedef struct *)以及用于分配和释放对象示例的函数(强制堆分配):
#ifndef FOO_H
#define FOO_H

typedef struct foo foo;
foo *foo_create();
void foo_bar(foo *f, bar *none);
foo_destroy(foo *f);

#endif

这就缩短了增量编译时间。特别是一个小的公开的实现细节(仅仅改变了结构体的大小)可能会产生涟漪效应,导致整个代码库的大部分都必须重新编译。顺便说一句,Michael Feathers:“有效地与遗留代码”,虽然日期,是一个真正有趣的书就这个主题。
1.在没有定义源代码的情况下链接代码。我们一直在使用库。
1.变量只能声明一次,因此您需要使其成为头文件中的外部变量,然后很可能链接声明一次。

相关问题