0

関数A()呼び出しをインライン マクロとして使用したいのですが、外部から見えるようにしB()たくありません。B()ユーザーが誤っA()て使用した場合は、コンパイラエラーが必要です。B()

インライン化せずにそれを行う方法を知っています:

// a.h
void A(void);

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

I#include "a.h"の場合、 にアクセスできますが、 にはアクセスできA()ませんB()。それはいいです; それが私が欲しいものです。

今、私は同じことをしたいのですが、インライン化することで呼び出しの複雑さを 1 レベル減らしますが、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

これは、呼び出しのオーバーヘッドが違いを生む低レベルのファームウェア用ですが、効率のために高レベルのコード管理を放棄したくありません。cppC++ ではこれは些細なことですが、純粋な C でそれを行うためのハックを探しています。

(私の場合、aは HAL をb表し、BSP を表します。HAL はプロセッサ固有ですが、BSP はボード (PCB) 固有です)

4

3 に答える 3

1

これを行う場合:

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

これはBin "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 に答える
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 before a.hを含めてください (または do#undef _B_H_を強制的にリロードしb.hます)。そうしないと、互換性のないスコープに関する警告またはエラーが発生します。(ローカル スコープでa.hインクルードしますが、ファイル スコープでインクルードすると、残りのローカル スコープ インクルードはすべて無視されます。)b.ha.cb.h

これはb.h、関数本体のスコープ内で許容される限り、追加の宣言を行う場合にも機能します。

于 2013-10-08T00:31:45.803 に答える