【发布时间】:2018-05-19 19:43:01
【问题描述】:
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,以下是否也可以工作?
【问题讨论】:
-
为什么头文件中有可执行代码?编译器没有有义务使函数内联 - 这不是宏。
-
@WeatherVane 但是,如果
inline函数不完全驻留在头文件中,您就无法真正将其包含在内,对吗? -
@JohnBoyer 如果你想强制编译器使用内联函数,你需要声明它
static inline。 -
测试中有趣的事情,当您从函数中删除内联标识符时,代码编译完美。另外,编译器应该只是将文本放在头文件中
#included的位置,所以头文件中的可执行代码对编译器应该没问题,(我自己不推荐)。
标签: c