2

私は C で独自のアサート関数を開発しており、ヘッダー ファイルで次のように宣言されています。

void Certify_Continuity( const char* expression, const int line, const char* file );

次のように定義されたマクロを使用して呼び出す必要があります。

#if !defined ( ENABLE_DEBUG ) || defined ( __CALLE__ )
#define DEBUG_ASSERT( e ) (void)(e)
#else
#define DEBUG_ASSERT( e ) ( e ) ? (void)0 : Certify_Continuity( #e, __LINE__, __FILE__ )
#endif

ここでの問題は、プログラマーがCertify_Continuityを直接呼び出すことができることです。

ユーザーが関数を直接呼び出すことを禁止し、マクロを使用してのみ呼び出すことを許可する手法はありますか?

4

2 に答える 2

3

関数を(foo)()呼び出すCのトリックを使用できますが、マクロを展開します(両方が存在するという仮定の下で)。foofoo()foo

あなたの場合、マクロは次のようになります。

#if !defined ( ENABLE_DEBUG ) || defined ( __CALLE__ )
#define DEBUG_ASSERT( e ) (void)(e)
#else
#define DEBUG_ASSERT( e ) ( e ) ? (void)0 : (Certify_Continuity)( #e, __LINE__, __FILE__ )
#endif
#define Certify_Continuity(x,y,z) YOU_SHOULD_NOT_CALL_Certify_Continuity()

ユーザーが直接呼び出そうとすると、存在しないCertify_Continuityエラーが発行されます。YOU_SHOULD_NOT_CALL_Certify_Continuity

もちろん、これはユーザーが のように呼び出すのを防ぐことはできません(Certify_Continuity)()

于 2013-04-11T14:03:49.497 に答える