为什么要将静态函数替换为类似对象的宏,#define STATIC static?

时间:2017-09-22 09:42:38

标签: c macros

我刚刚在遗留代码中发现了这一点。我知道使用宏,只要使用名称,它就会被宏的内容替换。它们最常用于为数字常量提供符号名称。我所知道的是preprocess没有类型安全,范围的概念。

这样做的真正好处是什么?

#define STATIC static
STATIC function1() { /*Do something*/ }

我知道静态函数只在该模块或翻译单元中可见。在C文件外部看不到它们。

为什么不直接声明,而不是宏替换?

static function1() { /*Do something*/ }

我以为我会在SO中找到答案,但我找不到合适的答案。

1 个答案:

答案 0 :(得分:4)

没有理由说你为什么要这样做。通常,以这种方式将关键字隐藏在#define后面是不好的做法,因为代码变得神秘而难以阅读。

怀疑它与编码风格有关,通常以大写编写各种函数说明符,特别是在Windows编程中。通常会指定某个调用约定。例如Windows中的CALLBACK,或旧的“Windows圣经”(Petzold)中的这个例子:

#define EXPORT __declspec (dllexport)

(在C ++的情况下,可以将其修改为包含extern "C"。)然后,您将拥有EXPORT void CALLBACK func (void)等函数。同样,Windows中也有WINAPI

有时我们也会看到像

这样的内容
#define PRIVATE static

这有点可怕,因为static与C ++中的private的含义并不相同。