C语言 使用宏进行静态声明

omhiaaxx  于 2023-06-21  发布在  其他
关注(0)|答案(1)|浏览(143)

在查看从AIX迁移到Cygwin64位的C代码时,我遇到了以下代码片段。在“#ifndef”指令中只写“static”对我来说没有意义。由于没有可用的文档或帮助,我在这里寻求帮助以理解此代码的含义。有人能解释一下代码是否有效吗?如果有效,为什么?它看起来可以编译并运行,但是“静态”在这里会有什么影响呢?

#ifndef __CYGWIN__
#define __CYGWIN__

static const char ccm_version[] = "%%%CCM_VERSION: %full_filespec: %%%"; /*#006#*/

#ifdef __CYGWIN__
static
#endif
void somefunc(void);
void somefunc(void) { 
    printf("%s \n", ccm_version); 
} /*#006#*/

我在Windows 11 Pro和gcc(GCC)11.3.0上使用Cygwin 64位

laik7k3q

laik7k3q1#

它是有效的,如果定义了__CYGWIN__,代码将static应用于函数原型:static void somefunc(void);。所以它等价于:

#ifdef __CYGWIN__
  static void somefunc(void);
#else
  void somefunc(void);
#endif

让一个函数声明紧跟在相应的函数定义之后是相当没有意义的……他们也可以将static存储说明符直接应用于函数定义。
至于这对这里有什么好处,没有一些背景,我不能肯定地说。创建一个函数static将给予它一个内部链接,并限制其他翻译单元的访问。这样做的原因可能是私有封装,解决多标识符链接器问题,进行一些本地单元测试,鼓励函数内联等。我不知道为什么在这里使用它,尽管在代码生成期间鼓励内联似乎是可能的。

相关问题