在新的代码库中工作,我遇到了一些看起来像这样的C代码:
static int* functionA(int* anInt);
#define functionA(anInt) ( <a 1 line '? :' function>)
对于那些C编码比他的头脑更新鲜的人来说,这可能是显而易见的,但对我来说这看起来有点奇怪。编译器似乎同意,因为它会发出一条消息,说明
错误:'functionA'声明为'static'但从未定义过。
(我正在使用gcc 4.8.2。)
正如我们正在评估的某些库代码中出现的那样,我认为对某些编译器而言,有些时候,这是有效的。有人可以帮忙解释它何时有效?
我最好的猜测是这种做内联静态函数定义的老式方法。然而,我有机会错过一些微妙的东西。对正在实现的内容的解释也会有所帮助,但实际上我想知道此代码何时有效。
答案 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选项,编译器会将所有警告发出为错误...请检查您是否使用该选项。
答案 2 :(得分:0)
#define
没有定义函数,它用代码表达式替换代码中的明显函数调用。 (除非我遗漏了某些内容,否则表达式是错误的;也许它只是一个占位符?)实际编译器看到functionA
的唯一时间是在静态声明中;它抱怨函数永远不会被定义。
编译器错误对我来说意外 - 我假设如果从不调用函数,则忽略静态声明。 (它永远不会被调用,因为#define
会导致这些“调用”被替换。)如果“{inlining by {{”,可能只需#define
静态声明就可以使用#if/#else
构造。 1}}“生效。
顺便说一句,对于现代编译器和常见的优化级别,这应该是不必要的;编译器会为你内联函数。