我不知道这是否可行,即使它是正确的,但我在.c文件中定义了一个宏,现在我想要公开该宏,所以我需要把它放在.h文件中。但我不想揭露它是如何实现的,只是要使用的签名。
//.c
#define sayhi() printf("hi");
//.h
sayhi()
//another.c
int main(...) {
sayhi();
}
答案 0 :(得分:7)
不要把它变成宏。只需将其设为函数调用。
您的.h文件:
extern void DoSomething(int x, int y, int z);
您的.c文件:
void DoSomething(int x, int y, int z)
{
// your code goes here.
}
答案 1 :(得分:5)
宏没有像函数那样的签名,它们仅在预处理阶段持续存在。你要么必须使它成为一个函数,要么使实现成为一个函数。
答案 2 :(得分:1)
预处理器没有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"