- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在用 C 编写一个大型项目,我想使用接口(interface) (.h) 和实现 (.c) 文件来组织它,类似于许多面向对象的语言,例如 Objective-C 或 Java。我熟悉在 C 中创建静态库,但我认为为我的项目这样做是不必要的复杂。如何在 ANSI C 中实现接口(interface)/实现范例?我主要使用 GCC 进行编译,但我的目标是严格遵守 ANSI C 和交叉编译器兼容性。谢谢!
最佳答案
听起来您已经做了正确的事情:好的 C 代码还在 .h 文件中组织接口(interface),在 .c 文件中组织实现。
示例 a.h 文件:
void f(int a);
示例 a.c 文件:
#include "a.h"
static void helper(void) {...}
void f(int a) {... use helper()...}
示例 main.c 文件:
#include "a.h"
int main(void) { f(123); return 0; }
你得到了模块化,因为辅助函数没有在头文件中声明,所以其他模块不知道它们(如果你愿意,你可以在 .c
文件的顶部声明它们)。拥有这种模块化减少了所需的重新编译次数,并减少了必须重新编译的量。 (不过每次都必须进行链接)。请注意,如果您没有在 header 中声明辅助函数,那么您已经很安全了,但是在它们前面放置 static
也会在链接期间将它们从其他模块中隐藏起来,因此如果有多个则不会发生冲突模块使用相同的辅助函数名称。
如果您只使用基本类型,那么您只需要知道这些就可以了,您可以在这里停止阅读。但是,如果您的模块需要使用结构,那么它会变得稍微复杂一些。
有问题的示例 header b.h:
typedef struct Obj {
int data;
}*Obj;
Obj make(void);
void work(Obj o);
您的模块想要传入和传出对象。这里的问题是,内部结构会泄露给依赖于此 header 的其他模块。如果表示更改为 float data
,则所有使用的模块都必须重新编译。解决此问题的一种方法是仅使用 void*
。那就是有多少程序这样做。然而,这很麻烦,因为每个获取 void*
作为参数的函数都必须将其转换为 Obj
。另一种方法是:
标题 c.h:
typedef struct Obj*Obj;
Obj make(void);
void work(Obj);
执行抄送:
#include "c.h"
typedef struct Obj {
int data;
}*Obj;
之所以可行,是因为 Obj 是一个指针(与按值/复制的结构相反)。其他依赖于该模块的模块只需要知道传入和传出的是一个指针,而不需要知道它指向什么。
关于c - ANSI C 中的接口(interface)/实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26205329/
我正在寻找一个控制代码来使用 ANSI 或其他一些标准在终端中创建橙色文本,这可能吗?我只看到黄色和红色可用,我认为您不能将红色和黄色混合用于同一个角色:) 最佳答案 严格来说,不:ANSI 从未标准
我知道 \33[nC移动光标 n列向前;问题是,我不知道特定行包含多少个字符。 最佳答案 什么都没有显式 ,但是屏幕“小”,您可以使用任何光标移动命令移动到任意远的目的地,终端将通过屏幕大小限制移动。
这个问题在这里已经有了答案: Oracle Joins - Comparison between conventional syntax VS ANSI Syntax (11 个回答) 8 年前关闭。
我知道在 bash 终端中,一种可靠的变色方法是使用 ANSI 转义序列。例如: echo -e "\033[0;31mbrown text\033[0;00m" 应该输出 brown text (i
上次我检查时,说您正在使用 ANSI C 编码等同于说“这是符合 C99 的代码,其中没有任何其他内容”。现在有了 C11 和 C++11,这种区别还存在吗?它还有某种意义吗? 最佳答案 历史上,“A
我的业务逻辑包含在大约 7000 行 T-SQL 存储过程中,其中大多数都具有下一个 JOIN 语法: SELECT A.A, B.B, C.C FROM aaa AS A, bbb AS B, cc
我的业务逻辑包含在大约 7000 行 T-SQL 存储过程中,其中大多数都具有下一个 JOIN 语法: SELECT A.A, B.B, C.C FROM aaa AS A, bbb AS B, cc
我正在使用 CentOS 7 和 PHP 7.0 TERM=xterm-256color 我确实有一个彩色提示和 ls 颜色,如果我通过 --ansi然后它确实显示为彩色,但我不想总是添加 --ans
在我工作过的每家公司,我发现人们仍然按照 ANSI-89 标准编写 SQL 查询: select a.id, b.id, b.address_1 from person a, address b wh
我正在使用 Delphi RIO 10.3.3。 当我将 Ansi 字符串作为 const 数组的元素之一传递时,string() 转换对其不起作用。为了让它工作,我必须先将 VAnsiString
我正在使用 Delphi RIO 10.3.3。 当我将 Ansi 字符串作为 const 数组的元素之一传递时,string() 转换对其不起作用。为了让它工作,我必须先将 VAnsiString
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
当我在终端上调整大小时,它保持全屏显示。我想,有某种方法可以找出终端的屏幕尺寸。我怎样才能在 VT100 中做到这一点? 使用 ,当我列出文件夹时,它以蓝色显示文件夹。 (或者让我们说不同的颜色)但是
我的程序正在向某个日志文件发送characters-colored文本: echo -e "\\033[38;5;2m-->\\033[0m Starting program." | tee $Log
我刚开始使用 gsoap。我只使用 c++ 取得了 4 个小成功,但是我当前的项目限制了我设置源代码生成选项来创建纯 ANSI C(不是 c++)。我似乎无法成功调用该服务,错误返回为 0xC0000
来自 http://blocktronics.org/ 的 ANSI 文件似乎使用的是另一种 ANSI 编码,而不是我的 VT100 终端仿真器支持的编码。 如果我使用 tetraview 查看这些文
如何在 Java 中将十六进制字符串转换为 ansi(窗口 1252)以及将 ansi(窗口 1252)转换为十六进制字符串。 python(完美运行) q = "hex string value"
我用 java 编写了一个 android 应用程序来获取用户答案并将它们保存在一个文件中。问题是这个文件是以 utf-8 格式保存的。最终用户将在 IBM SPSS 中打开这些文件,这是一种适用于
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 锁定。这个问题及其答案
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicates: Floating point inaccuracy examples Is JavaScript's Ma
我是一名优秀的程序员,十分优秀!