did/does 在 C 中使用#define 定义静态函数时工作?

When did/does using #define to define a static function in C work?

在新的代码库中工作,我遇到了一些如下所示的 C 代码:

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

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

error: ‘functionA’ declared ‘static’ but never defined.

(我使用的是 gcc 4.8.2。)

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

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

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

那个编译器错误出乎我的意料——我假设如果从未调用该函数,静态声明将被忽略。 (它永远不会被调用,因为 #define 导致那些 "calls" 被替换。)如果 "inlining by #define"生效。

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

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

static int* functionA(int* anInt);

但是没有定义它,然后你添加了一个宏,它会用 (<a 1 line '? :' function>) 替换代码中出现的每个 functionA(value);,因此你不能使用 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));

As this is has turned up in some library code that we are evaluating I assume that for some compilers, some of the time, this is valid. Please could someone help explain when it is valid?

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

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

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