外排的问题我理解“内联”本身就是对编译器的一种建议,在它的设计过程中,它可能会或可能不会内联这个函数,它还会生成可链接的对象代码。我认为“静态内联”也是如此(可能是内联,也可能不是内联),但是在内联时不会生成可链接的对象代码(因为没有其他模块可以链接到它)。“内插”在图片中的位置是什么?假设我想用内联函数替换预处理器宏,并要求这个函数内联(例如,它使用_file_和_line_宏,应该为调用方解析,而不是这个被调用的函数)。也就是说,如果函数没有内联,我希望看到编译器或链接器错误。“extern inline”会这样做吗?(我假设,如果没有,除了坚持宏之外,没有其他方法可以实现这种行为。)C+和C之间有什么区别吗?不同的编译器供应商和版本之间有区别吗?
3 回答
人到中年有点甜
TA贡献1895条经验 获得超7个赞
inline
, static inline
extern inline
GNU89:
inline
:函数可能是内联的(不过只是个提示)。一个线外的版本总是被发出和外部可见。因此,您只能在一个编译单元中定义这样一个内联,而其他每一个编译单元都需要将其视为一个离线函数(否则在链接时会得到重复的符号)。 extern inline
不会生成出线版本,但可能会调用一个版本(因此,您必须在其他编译单元中定义该版本)。不过,单定义规则是适用的;出线版本必须具有与此处提供的内联代码相同的代码,以防编译器调用该代码。 static inline
将不会生成一个外部可见的出线版本,尽管它可能会生成一个文件静态版本。“一个定义”规则不适用,因为从来没有发出外部符号,也没有对外部符号的调用。
C99(或GNU99):
inline
*与GNU89一样“内联外挂”;没有发出外部可见函数,但可能会调用一个函数,因此必须存在 extern inline
类似于GNU89“内联”:发出外部可见代码,因此最多一个翻译单元可以使用此代码。 static inline
*像GNU89“静态内联”。这是gnu 89和c99之间唯一的便携式
C+:
static inline
extern inline
偶然的你
TA贡献1841条经验 获得超3个赞
因为它使用_file_和_line_宏,应该为调用方解析,而不是这个被调用的函数。
- 3 回答
- 0 关注
- 446 浏览
添加回答
举报
0/150
提交
取消