【发布时间】:2013-10-08 00:08:02
【问题描述】:
我想让函数A() 调用B() 作为内联宏,但我不希望B() 对全世界可见。我只希望A() 可见,如果用户不小心使用了B(),我想要编译器错误。
我知道不用内联怎么做:
// a.h
void A(void);
// a.c
#include "b.h"
void A(void) { B(); }
如果我#include "a.h",那么我可以访问A(),但不能访问B()。没关系;这就是我想要的。
现在我想做同样的事情,但通过将B 内联到A 来降低一级调用复杂性,但我想隐藏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)的)
【问题讨论】:
-
你知道#undef,对吧?
-
在我看来,“高级代码管理”和“cpp hacks”是相互排斥的。一般来说,你无法让 C 编译器阻止一个决心忽略内部文档的开发人员;这就是代码审查的目的。
-
@CharlieBurns -- 我知道#undef,但在这种情况下你如何使用它?我不能
#undef A。 -
@MarkLakata,对不起,我想我误解了你的问题。
标签: c include header-files c-preprocessor