gpt4 book ai didi

c - 让函数仅使用宏调用

转载 作者:行者123 更新时间:2023-12-02 07:03:45 26 4
gpt4 key购买 nike

我正在用 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

有什么技巧可以禁止用户直接调用该函数,只允许他使用宏调用它吗?

最佳答案

宏只是在编译器正常运行之前执行的文本(标记)替换,因此您不能阻止某人手动扩展宏并删除他们不喜欢的部分。

但是,您可以任意地让某人这样做变得困难和危险。例如,您可以从头文件中省略 Certify_Continuity 的声明,像这样直接声明它:

#define DEBUG_ASSERT(e) do { \
extern void Certify_Continuity( const char* expression, const int line, const char* file ); \
if(!(e)) Certify_Continuity(#e, __LINE__, __FILE__); \
} while(0)

这样,任何直接调用该函数的人都必须先声明原型(prototype)。

你也可以这样命名,别人会三思而后行:

void DO_NOT_CALL__USE_DEBUG_ASSERT__Certify_Continuity(...)

当然,如果有人有足够的决心绕过你,并且不关心他们代码中的疯狂疣,那就是他们的问题。如果他们为您工作或与您一起工作,那就是您使用代码审查等外部因素来阻止这种行为的时候。

关于c - 让函数仅使用宏调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15950476/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com