什么时候/确实使用#define在C工作中定义静态函数?

时间:2015-04-30 10:44:20

标签: c gcc static-functions

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

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

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

  

错误:'functionA'声明为'static'但从未定义过。

(我正在使用gcc 4.8.2。)

正如我们正在评估的某些库代码中出现的那样,我认为对某些编译器而言,有些时候,这是有效的。有人可以帮忙解释它何时有效?

我最好的猜测是这种做内联静态函数定义的老式方法。然而,我有机会错过一些微妙的东西。对正在实现的内容的解释也会有所帮助,但实际上我想知道此代码何时有效。

3 个答案:

答案 0 :(得分: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));

答案 1 :(得分:2)

  

正如我们正在评估的一些库代码中出现的那样   假设对于某些编译器,有些时候,这是有效的。   有人可以帮忙解释它何时有效?

如果在声明它的源文件中没有functionA的实际定义它也没有使用,编译器应该发出“声明'静态'但从未定义”为警告。 / p>

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

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

答案 2 :(得分:0)

#define没有定义函数,它用代码表达式替换代码中的明显函数调用。 (除非我遗漏了某些内容,否则表达式是错误的;也许它只是一个占位符?)实际编译器看到functionA的唯一时间是在静态声明中;它抱怨函数永远不会被定义。

编译器错误对我来说意外 - 我假设如果从不调用函数,则忽略静态声明。 (它永远不会被调用,因为#define会导致这些“调用”被替换。)如果“{inlining by {{”,可能只需#define静态声明就可以使用#if/#else构造。 1}}“生效。

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