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
?
答案 0 :(得分:1)
C99标准对6.7.4&#34;函数说明符&#34;中的内联函数说了这些:
内联定义提供了外部定义的替代方法,翻译者可以使用该定义在同一翻译单元中实现对该功能的任何调用。未指定对函数的调用是使用内联定义还是使用外部定义。
因此,实现可以选择不内联函数调用,在这种情况下需要有函数的外部定义。我猜测,因为断言是一个调试工具,GCC不想内联具有有效断言的函数来帮助调试。