- 此问题在此处已有答案**:
(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);
我不知道为什么头文件中没有定义结构超时?
1条答案
按热度按时间tquggr8v1#
struct
可能会泄漏您希望隐藏的实现细节(以使更改更容易甚至可能)。为此,您只需将struct
的前向声明(可选地公开为typedef struct
或typedef struct *
)以及用于分配和释放对象示例的函数(强制堆分配):这就缩短了增量编译时间。特别是一个小的公开的实现细节(仅仅改变了结构体的大小)可能会产生涟漪效应,导致整个代码库的大部分都必须重新编译。顺便说一句,Michael Feathers:“有效地与遗留代码”,虽然日期,是一个真正有趣的书就这个主题。
1.在没有定义源代码的情况下链接代码。我们一直在使用库。
1.变量只能声明一次,因此您需要使其成为头文件中的外部变量,然后很可能链接声明一次。