gpt4 book ai didi

c - 如何使用宏或其他机制强制执行 API 定义?

转载 作者:太空宇宙 更新时间:2023-11-04 06:20:48 25 4
gpt4 key购买 nike

我有一个 C 头文件作为我正在开发的 API 的一部分,它公开了许多函数。例如:

api.h

void foo();
int bar(char * foobar);

现在,我公开的大多数功能实际上都是在 API 中定义的,但是,我留给使用开发人员自己实现一些功能。为了让开发人员更轻松并强制遵守我的 API,我添加了以下宏:

api.h(已修改)

#define DEFINE_FOO() \
void foo()
void foo();
#define DEFINE_BAR() \
int bar(char * foobar)
int bar(char * foobar);

使用如下:

实现.c

#include "api.h"
DEFINE_FOO() {
// Codez
}

DEFINE_BAR() {
// More codez
}

关于这种方法,令我困扰的一件事是开发人员将使用 DEFINE_* 宏,但不一定凭直觉认为函数(即“bar”)接受参数。有没有办法改进这种方法,或者有更好的方法在 C 中强制执行自定义 API 定义?谢谢!

最佳答案

确实没有必要使用宏,我建议不要使用宏(在过去 35 年以上的时间里,我用宏做过很多“疯狂”的事情)。 p>

如果您要定义 API,这意味着您要将 [ANSI] 原型(prototype)放入 api.h 中以用于所有 您的函数。这并不意味着将实现它们——它仅意味着您定义架构/API。任何在 api.h 中没有原型(prototype)的函数都不是 API 的一部分 [显然]。

如果你这样做,编译器会标记任何不匹配的地方。只需要求开发人员在顶部包含 api.h

这是一个api.h:

void foo(void);
int bar(char *foobar);

符合标准的 .c 将干净地编译:

#include "api.h"
#include <stdio.h>

void
foo(void)
{
}

int
bar(char *str)
{
return 0;
}

不一致的 .c不能正确编译:

#include "api.h"
#include <stdio.h>

void
foo(int x)
{
printf("foo: %d\n",x);
}

int
bar(char *str)
{
return 0;
}

你会得到编译错误:

bad.c:5:1: error: conflicting types for ‘foo’
foo(int x)
^
In file included from bad.c:1:0:
api.h:2:6: note: previous declaration of ‘foo’ was here
void foo(void);
^

因此,如果开发人员犯了错误,普通的代码定义会处理它。

关于c - 如何使用宏或其他机制强制执行 API 定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35492406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com