如果未调用引用的库函数,它是否会被链接?

zr.*_*zr. 5 c standards linkage

假设我们有一个库的以下接口:

// my_interface.h
typedef float (*myfunc)(float);
myfunc get_the_func();
Run Code Online (Sandbox Code Playgroud)

并假设实现如下:

// my_impl.c
#include <math.h>
myfunc get_the_func() {
    return sinf;
}
Run Code Online (Sandbox Code Playgroud)

现在假设客户端代码执行以下操作:

#include "my_interface.h"
...
myfunc func = get_the_func();
printf("%f\n", func(0.0f));
Run Code Online (Sandbox Code Playgroud)

标准是否保证get_the_function()将返回标准数学库sinf()的地址?如果是这样,标准中的这个含义是什么?请注意,sinf()未在任何地方显式调用.

das*_*ght 6

该标准不需要调用外部函数:被引用就足以保留在翻译结果中.根据标准的5.1.1.2.1节,在翻译的八个阶段(和最后一个阶段)

解析所有外部对象和函数引用.链接库组件以满足对当前转换中未定义的函数和对象的外部引用.

由于返回指向函数的指针被认为是对它的引用,因此标准保证sinf将链接到您提供给链接器的任何实现,这些实现可能是也可能不是来自标准数学库的实现.