SLN*_*SLN 6 c++ linker compiler-errors inline
以下来自 C++ 入门书的引用让我很困惑
与其他函数不同,内联函数和 constexpr 函数可以在程序中定义多次。毕竟,编译器需要定义,而不仅仅是声明,才能扩展代码。但是,给定 inline 或 constexpr 的所有定义必须完全匹配。因此,内联函数和 constexpr 函数通常在标头中定义。-- C++ 入门第 5 版,240 页
“可能在程序中定义多次”这句话让我很困惑。据我了解,声明可以多次,但定义只需要一次。
有人可以举个例子为什么有多重定义吗?
在头文件(我们称之为foo.h
)中你可以有
inline int foo() { /* do stuff */ }
Run Code Online (Sandbox Code Playgroud)
现在,如果您包含foo.h
在几个 cpp 文件中,那么foo
将在每个文件中定义,这将是一个多重定义错误。由于foo
标记为inline
好像,所以没关系,因为所有定义都是相同的。
据我了解,声明可以多次,但定义只需要一次
编译器在翻译单元(基本上是一个 cpp 文件)上工作,在其中,它可以进行各种优化,但函数内联除外,并constexpr
要求编译器知道函数的定义。这意味着每个翻译单元都需要其中函数的定义。我们使用内联来解决这个问题,否则会出现多重定义错误。
归档时间: |
|
查看次数: |
1569 次 |
最近记录: |