如何在.c中实现宏但公开它以在.h文件中使用

时间:2013-06-19 00:00:45

标签: c

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

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

//.h
sayhi()

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

3 个答案:

答案 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源代码的链接语义,因此宏扩展到的内容将取决于预处理器看到的最后一个定义。因此,您确实需要将宏的定义保留在标题中。

我想到了两种方法:

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

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

  3. // 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"