divide.h

#pragma once

#include <assert.h>

inline int divide(int a, int b)
{
        assert(b != 0);
        return a / b;
}


main.c

#include <divide.h>

int main(void)
{
        divide(10, 2);
        return 0;
}


我不能仅由于assert来编译以下内容。如果我删除断言,一切正常。

$ gcc --version
gcc (GCC) 8.1.0
$ gcc main.c
main.c:(.text+0xf): undefined reference to `divide'
$ gcc main.c -O3 # Compilation with optimization works as asserts are removed.


divide的定义放在.c文件中时,一切正常。但是,由于该函数被声明为inline,因此以下内容也不行吗?

最佳答案

C99标准在6.7.4“功能说明符”中对内联功能进行了说明:


  内联定义提供了外部定义的替代方法,翻译器可以使用该替代方法在同一翻译单元中实现对该函数的任何调用。未指定对函数的调用是使用内联定义还是使用外部定义。


因此,实现可以选择不内联函数调用,在这种情况下,需要对函数进行外部定义。我猜想因为断言是一种调试工具,所以GCC不想内联具有活动断言的函数来帮助调试。

关于c - 具有assert的内联函数会创建 undefined reference 吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50428869/

10-10 17:41
查看更多