这个问题主要是措辞问题。 对于内联函数和内联定义,C11对它们的描述如下:
6.7.4第6页:
使用 inline 函数说明符声明的函数是 inline 功能.
和:
6.7.4 p7:
任何具有 内部链接的函数都可以是 内联函数。对于一个 具有外部链接的功能,则适用以下限制:如果 函数是用 inline 函数说明符声明的,那么它应该 也可以在同一个翻译单元中定义。如果所有文件范围 翻译单元中函数的声明包括 inline 没有 extern 的函数说明符,则其中的定义 翻译单元是一个内联定义。
首先,对于“任何具有内部链接的函数都可以是内联函数”这句话, 坦白说,我觉得这句话是正确的,但却是多余的。因为根据内联函数的定义,只要出现“inline”,那么该函数就是一个内联函数 .
继续阅读。
结合前文,我对后文的理解是,如果打破了标准中提到的限制,那么具有外部链接的函数就不会是内联函数。
显然这是不正确的。因为一个函数是否是内联函数与其链接无关。 6.7.4 p10中的一句话也很好地证明了这一点:
声明具有外部链接的内联函数可能会导致 在外部定义或可供使用的定义中 仅在翻译单元内。 使用 extern 的文件范围声明 创建外部定义。下面的例子展示了一个完整的 翻译单位。···
“只能在翻译单元内使用的定义”,(1)我认为这个定义指的是内联定义。
那么这句话的粗体部分表示内联函数可以有内联定义或外部定义。
所以,(2)对于第 6.7.4 p7 部分,我想标准应该想说:
任何具有 内部链接的内联函数都有一个内联定义。 对于具有 外部链接的内联函数,...
我的问题是,我对标有(1)和(2)的地方的理解有错误吗?\
这可能是一个毫无意义且无聊的问题。但仍然感谢您的阅读。
我对下面文字的理解是,如果打破了标准中提到的限制,那么具有外部链接的函数将不是内联函数。
你的理解是错误的。它并不是说“如果你违反了限制,那么……”。它的意思是“你不能违反这些限制”。违反这些限制的程序不是有效的 C 程序。