我不知道这是否可能,即使它是否正确,但我在 .c 文件中定义了一个宏,现在我想公开该宏,所以我需要将它放在 .h 文件中。但我不想公开它是如何实现的,只是为了使用的签名。
//.c
#define sayhi() printf("hi");
//.h
sayhi()
//another.c
int main(...) {
sayhi();
}
我不知道这是否可能,即使它是否正确,但我在 .c 文件中定义了一个宏,现在我想公开该宏,所以我需要将它放在 .h 文件中。但我不想公开它是如何实现的,只是为了使用的签名。
//.c
#define sayhi() printf("hi");
//.h
sayhi()
//another.c
int main(...) {
sayhi();
}
那就不要让它成为宏。只需将其设为函数调用即可。
您的 .h 文件:
extern void DoSomething(int x, int y, int z);
您的 .c 文件:
void DoSomething(int x, int y, int z)
{
// your code goes here.
}
宏不像函数那样有签名,它们只存在于预处理阶段。您要么必须将其设为函数,要么将实现设为函数。
预处理器没有任何类似于 C 源代码的链接语义,因此宏扩展的内容将取决于预处理器看到的最后一个定义。出于这个原因,您确实需要将宏的定义保留在标题中。
想到了两种方法:
将尽可能多的宏功能委托给函数,并在标头中声明宏和函数原型。您可以将函数的实现放在源文件中。
将宏的定义放在私有标头中。
// hi_internal.h
#define sayhi() printf("Hello, world!");
将此包含在您的公共标题中,并附上解释性评论。
// hi.h
#define sayhi()
// hi_internal redefines the above macros.
// It must be included after the above definitions.
#include "hi_internal.h"