我在.c(不带标头声明)中定义了我的函数,如下所示:

inline int func(int i) {
 return i+1;
}

然后在下面的同一个文件中,我使用它:

...
i = func(i);

在链接过程中,我得到了"未定义的对‘func’的引用".为什么?

推荐答案

C99中的inline种模式与大多数人的思维方式不同,特别是与C++所使用的模式不同.

inline只是一个提示,编译器不会抱怨双重定义的符号.它不能保证函数是内联的,如果需要的话,实际上也不能保证生成符号.要强制生成符号,必须在inline定义中添加一种实例化:

int func(int i);

通常在头文件中有inline个定义,然后包含在多个头文件中.c文件(编译单元).你只能在一个编译单元中找到上面这一行.您可能只看到您遇到的问题,因为您没有在编译器运行中使用优化.

所以,你的用例中有inline个.c文件没有多大意义,最好使用static,即使是额外的inline也买不到多少.

C++相关问答推荐

librsvg rsvg_handle_get_dimensions获取像素大小与浏览器中的渲染大小没有不同

Apple Libm的罪恶功能

如何启用ss(另一个调查套接字的实用程序)来查看Linux主机上加入的多播组IP地址?

在C中使用JMP_buf数组进行线程化(在xv6中测试)

空指针的运行时强制转换

我无法让LLDB正确运行我的可执行文件

如何知道我是否从非阻塞套接字读取所有内容

在C++中使用函数指针的正确语法

GCC不顾-fno-Builtin-SINCOS旗帜向SINCOS发出呼唤

在Rust和C之间使用ffi时如何通过 struct 中的[U8;1]成员传递指针

使用错误的命令执行程序

是否需要包括<;errno.h>;才能使用perror?

一旦运行长度超过2,编译器是否会优化";strnlen(mystring,32)>;2";以停止循环?

ifdef __cplusplus中的整数文字单引号

如何在VS 2022中正确安装额外的C头文件

按长度对argv中的单词进行排序

我在C程序的Flex/Bison中遇到语法错误

在C中交换字符串和数组的通用交换函数

函数的typedef是标准 C 语法吗?它与函数指针的typedef有何不同?

如何转义包含指令中的字符?