带有assert的内联函数会创建一个未定义的引用吗?

时间:2018-05-19 19:43:01

标签: c

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

,因此以下内容也不应该有效

1 个答案:

答案 0 :(得分:1)

C99标准对6.7.4&#34;函数说明符&#34;中的内联函数说了这些:

  

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

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