0

我想将函数A()调用B()作为内联宏,但我不想B()让世界看到。我只想要A()可见,如果用户B()意外使用,我想要编译器错误。

我知道如何在没有内联的情况下做到这一点:

// a.h
void A(void);

// a.c
#include "b.h"
void A(void) { B(); }

如果我#include "a.h",那么我可以访问A()但没有B()。没关系; 这就是我想要的。

现在我想做同样的事情,但通过内联来减少一级调用复杂性BA但我想隐藏B.

// a.h
#include "b.h"
#define A() B()
#uninclude "b.h"   <----This is bogus, but I want the equivalent.


// main.c
#include "a.h"
A();  <-- ok
B();  <-- undefined function

这是针对低级固件的,调用开销确实会产生影响,但我不想仅仅为了提高效率而放弃高级代码管理。在 C++ 中,这是微不足道的,但我正在寻找cpp在纯 C 中执行此操作的技巧。

(在我的例子中,a代表一个 HAL 并b代表一个 BSP。HAL 是特定于处理器的,而 BSP 是特定于板(PCB)的)

4

3 回答 3

1

如果唯一的声明b.h是声明B而不是定义,那么你可以这样做a.h

// a.h
static inline void A(void)
{
    #undef _B__H_  //need this if you have more than one of these inline declarations
    #include "b.h"
    B();
}

假设b.h看起来像这样:

// b.h
#ifndef _B_H_
#define _B_H_
void B(void);
#endif

那么 的 声明B仅在 范围内A

a.c,一定要包括b.h 之前 a.h(或#undef _B_H_强制重新加载b.h)。否则,您将收到有关不兼容范围的警告或错误。(a.h包括b.h在本地范围内,而在文件范围内a.c包括b.h则忽略所有剩余的本地范围包括。)

如果b.h进行额外的声明,这也将起作用,只要它们在函数体的范围内是可以接受的。

于 2013-10-08T00:31:45.803 回答
1

如果你这样做:

#define B A
#include "b.h"
#undef B

这将B“bh”中的定义更改为的定义A。这需要b.hdefine B,而不仅仅是声明它,所以这可能不是你想要的。

然后在那之后,在出现这些行的文件中,代码可以使用A(使用诸如 的调用A()),但B范围内没有声明。所以尝试使用B会导致编译器错误。(其他声明b.h将在范围内。)

于 2013-10-08T00:26:14.540 回答
1
#define A() (B)()
#define B() syntax error

写作的人B()会收到报告的语法错误(以某种形式或形式)。写信的人A()会产生对 的调用(B)(),这没关系。

当然,这并不会阻止某人编写(B)()代码,但它已经完成了 80% 的工作。

于 2013-10-08T00:26:24.610 回答