2

我不知道这是否可能,即使它是否正确,但我在 .c 文件中定义了一个宏,现在我想公开该宏,所以我需要将它放在 .h 文件中。但我不想公开它是如何实现的,只是为了使用的签名。

//.c
#define sayhi() printf("hi");

//.h
sayhi()

//another.c
int main(...) {
    sayhi();
}
4

3 回答 3

7

那就不要让它成为宏。只需将其设为函数调用即可。

您的 .h 文件:

extern void DoSomething(int x, int y, int z);

您的 .c 文件:

void DoSomething(int x, int y, int z)
{
    // your code goes here.
}
于 2013-06-19T00:04:43.973 回答
5

宏不像函数那样有签名,它们只存在于预处理阶段。您要么必须将其设为函数,要么将实现设为函数。

于 2013-06-19T00:03:44.707 回答
1

预处理器没有任何类似于 C 源代码的链接语义,因此宏扩展的内容将取决于预处理器看到的最后一个定义。出于这个原因,您确实需要将宏的定义保留在标题中。

想到了两种方法:

  1. 将尽可能多的宏功能委托给函数,并在标头中声明宏和函数原型。您可以将函数的实现放在源文件中。

  2. 将宏的定义放在私有标头中。

// 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"
于 2013-06-19T00:11:56.960 回答