以下是什么意思?
ISO / IEC 14882:2011
7.1.2函数说明符[dcl.fct.spec] ...
3 ...内联说明符不应出现在块作用域函数中 声明。
根据这个引用,这是否无效?
#include <iostream>
int main()
{
inline void foo();
foo();
}
void foo()
{
std::cout << "::foo() \n";
}
gcc编译它没有任何错误。
我错了吗?
答案 0 :(得分:2)
根据这个引用,这是否无效?
是的,由于您在问题文本中引用的标准段落,它无效。
编译器接受它的事实可能是错误或文档扩展,但绝对不符合C ++ 11标准。
其他信息:
当我尝试使用GCC 4.7.2编译上述程序时,我收到一条警告:
警告:
'inline'
说明符对于在全局范围之外声明的函数'foo'
无效[-pedantic
]
答案 1 :(得分:0)
我认为gcc
在这里欺骗自己。这应该是非法的。这里发生的事情是gcc
将inline void foo();
添加到其符号表中,认为它未定义。因此,就其而言,调用foo();
应该是未定义的。
但是,当链接器(ld
)稍后尝试链接代码时,它会在全局范围内找到foo
的定义,该定义可以访问并使用该代码。