2

在一个新的代码库中工作,我遇到了一些看起来像这样的 C 代码:

static int* functionA(int* anInt);
#define functionA(anInt) ( <a 1 line '? :' function>)

也许这对于那些 C 编码比我的头脑更新鲜的人来说是显而易见的,但对我来说这看起来有点奇怪。编译器似乎同意,因为它吐出一条消息说明

错误:“functionA”声明为“静态”但从未定义。

(我使用的是 gcc 4.8.2。)

由于这已经出现在我们正在评估的一些库代码中,我假设对于某些编译器,有时这是有效的。请有人帮忙解释一下它什么时候有效?

我最好的猜测是这是一些老式的内联静态函数定义方式。但是,我很有可能会遗漏一些微妙的东西。对正在实现的目标进行解释也会有所帮助,但我真的想知道这段代码何时有效。

4

3 回答 3

2

你的编译器是对的,你声明了一个static函数

static int* functionA(int* anInt);

但是没有它的定义,然后您添加了一个宏,它将用 替换functionA(value);代码中的每个出现(<a 1 line '? :' function>),因此static即使它有定义,您也不能再使用该函数。

函数定义是

static int *functionA(int* anInt)
{
    /* do something with `aInt' */
}

使用宏时,预处理器将采用此代码

#define addnumbers(x, y) ((x) + (y))

double x = addnumbers(1.5, 6.7);

double x = ((1.5) + (6.7));
于 2015-04-30T10:50:58.000 回答
2

由于这已经出现在我们正在评估的一些库代码中,我假设对于某些编译器,有时这是有效的。请有人帮忙解释一下它什么时候有效?

如果在声明它的源文件中没有 functionA 的实际定义,它也没有被使用,编译器应该发出“declared 'static' but never defined”作为警告

但是,如果您使用 -Werror 选项,编译器会将所有警告作为错误发出...检查您是否正在使用该选项。

https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

于 2015-04-30T11:06:36.063 回答
0

#define不定义函数,它用内联表达式替换代码中明显的函数调用。(除非我错过了什么,否则表达式格式不正确;也许它只是一个占位符?)实际编译器看到的唯一时间functionA是在静态声明中;它抱怨从未定义过该功能。

该编译器错误出乎我的意料——我假设如果从未调用该函数,静态声明将被忽略。(它永远不会被调用,因为#define导致那些“调用”被替换。)如果“inlining by ”有效,则应该#define使用构造简单地删除静态声明。#if/#else#define

顺便说一句,对于现代编译器和常见的优化级别,这应该是不必要的;编译器会为你内联函数。

于 2015-04-30T10:46:51.390 回答