首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C语言中的接口分离与实现

C语言中的接口分离与实现
EN

Stack Overflow用户
提问于 2014-06-21 08:58:47
回答 4查看 1.1K关注 0票数 3

在将接口与C中的实现分离时,包含头文件的正确位置在哪里?

在接口文件(.h文件)中还是在实现文件(.c文件)中?为什么?

我的样本代码:

console.h

代码语言:javascript
运行
复制
#ifndef CONSOLE_H
#define CONSOLE_H

#include <windows.h>

void gotoxy (const WORD x, const WORD y);

void clearScreen();

#endif

console.c

代码语言:javascript
运行
复制
#include <stdlib.h>
#include "console.h"

COORD coord = {0,0};

void gotoxy (const WORD x, const WORD y){
    coord.X = x;
    coord.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

void clearScreen(){
    system("cls");
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-06-21 09:45:25

以下是一些原则:

  1. 不必要的包含头只会增加编译时间. 这听起来可能是可以忽略的,而且通常是这样的,但是如果你养成了太多包含的习惯,它就会成为一个问题。 假设您的项目有一个通用标题,其中包括所有其他项目头和它们可能需要的所有系统标头。因此,任何.c文件只需要包括这一个头,并完成它。这很方便。但是,除了稍微延长每个.c文件的编译时间之外,它还保证每次更改单个标头时都必须重新编译整个项目。这将大大减慢您的修改-编译-测试周期。
  2. 您必须避免创建循环包含依赖项. 如果你确实创建了一个循环包含,你就有麻烦了。因此,最好避免包含任何不必要的内容:包含的越少,可以触发循环包含的标题就越少。有时,您可能需要插入前向声明而不是包含。
  3. .c文件必须包括它的.h文件. 如果您做不到这一点,.c文件中的函数签名将不会根据.h文件中的声明进行检查,随后会出现疯狂。 这个原则的问题是,如果.c文件没有定义实现所需的类型,那么.h文件可以很好地编译,而无需包含。然而,包含必须在那里,以防止签名不匹配。

因此,除了第3点之外,谨慎的做法是只包含绝对需要的头,并且只包含在实际需要它的文件中。就我个人而言,我经常只在收到编译器错误告诉我缺少了什么东西之后才包含一个标头。

票数 3
EN

Stack Overflow用户

发布于 2014-06-21 09:05:37

应该始终将包含指令包括在需要它们的文件中,或者使读取和理解代码更容易。

在您的示例中,在控制台中包含了windows.h。对于这样一个常见的头文件,只将它放在控制台中是可以的。但是,如果您使用的是您编写的另一个库,并且还没有被广泛采用,那么明智的做法是将它包含在两个文件中,以防止未来的开发人员不得不通过头文件搜索提供控制台中提供的功能的头文件。

票数 2
EN

Stack Overflow用户

发布于 2014-06-21 09:45:44

我只会对您的设置进行两次更改。我将在头文件中包含所有头部,但console.h头除外,这是包含头文件所必需的。其次,当您使用#define CONSOLE_H 1时,给它一个值,1就可以了。我只是防止一个未初始化的标签。看起来不错。

console.h

代码语言:javascript
运行
复制
#ifndef CONSOLE_H
#define CONSOLE_H  1

#include <windows.h>
#include <stdlib.h>

void gotoxy (const WORD x, const WORD y);

void clearScreen();

#endif

console.c

代码语言:javascript
运行
复制
#include "console.h"

COORD coord = {0,0};

void gotoxy (const WORD x, const WORD y){
    coord.X = x;
    coord.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

void clearScreen(){
    system("cls");
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24340016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档