【问题标题】:Why to replace static function as object-like macro, #define STATIC static?为什么要将静态函数替换为类似对象的宏,#define STATIC static?
【发布时间】:2018-03-03 20:23:44
【问题描述】:

我刚刚在遗留代码中发现了这一点。我知道使用宏时,每当使用名称时,都会将其替换为宏的内容。它们最常用于为数字常量提供符号名称。我所知道的是预处理没有类型安全、范围的概念。

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

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

我知道静态函数仅在该模块或翻译单元中可见。在它们定义的 C 文件之外不可见。


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

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

我以为我会在 SO 中找到答案,但我没有找到任何合适的答案。

【问题讨论】:

  • 这通常使用宏来完成,根据您在编译时使用的选项,宏具有不同的替换,因此它可能并不总是扩展成相同的东西。
  • 也许这个问题是相关的:stackoverflow.com/questions/32398612/…
  • @Barmas,在那种情况下,它只是覆盖了编译时静态函数的范围?
  • 您可以通过更改为#define STATIC(空替换)来更改所有功能,突然它们不再是静态的了。这是否有好处是值得怀疑的。
  • @qwn PCHAR 的定义很糟糕,应该是 typedef。例如,PCHAR a, b;非常具有误导性,因为a 将是char *,但b 将是char

标签: c macros


【解决方案1】:

您没有合理的理由这样做。通常,以这种方式将关键字隐藏在 #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 的含义并不相同。

【讨论】:

  • 有时在调试过程中inline 被替换为空。所以有时用空替换inline 很方便。与长属性相同,PACKED__attribute__((__packed__)) 更易于阅读。大写字母通常表示宏。
  • @Lundin,真的,我觉得这样做不好,更难阅读代码。
猜你喜欢
  • 1970-01-01
  • 2019-10-17
  • 1970-01-01
  • 2020-06-17
  • 2016-11-02
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
  • 2011-10-02
相关资源
最近更新 更多