假设我有一个包含 function 的公共定义的库void foo();。库在内部调用此函数。为了获得最佳性能,我希望内联内部调用。我还想防止外部代码看到定义,以便稍后我可以在不破坏 ABI 的情况下更改实现。这是一段代码:
MyLib.h:
void foo();
Run Code Online (Sandbox Code Playgroud)
MyLibInlined.h:
inline void foo() { code here }
Run Code Online (Sandbox Code Playgroud)
MyLib.cpp
#define inline
#include "MyLibInlined.h"
Run Code Online (Sandbox Code Playgroud)
问题是它是否违反了 ODR 还是被认为是不好的做法?
编辑:foo如果是成员函数
怎么办?
问题是它是否违反了 ODR 还是被认为是不好的做法?
它不会破坏 ODR,但它破坏了 [dcl.fct.spec] 中的规则:
如果具有外部链接的函数在一个翻译单元中被声明为内联,则该函数在其出现的所有翻译单元中也应被声明为内联;无需诊断。
相反,您应该拥有该函数的公共版本(未声明为内联),并且拥有在库中使用的内部版本:
// MyLibInlined.h
inline void foo_impl() { }
Run Code Online (Sandbox Code Playgroud)
然后在库内部定义foo为对内部库的调用:
// MyLib.cpp
#include "MyLibInlined.h"
void foo() { foo_impl(); }
Run Code Online (Sandbox Code Playgroud)
或者,如果所有调用都foo()在一个文件中,您根本不需要担心,只需将其定义为非内联函数,并让编译器将其内联到定义可见的文件中:
// MyLib.h
void foo();
// MyLib.cpp
void foo() { code here }
// use foo ...
Run Code Online (Sandbox Code Playgroud)
关键字inline并不意味着函数将被内联,它意味着定义是在标头中内联提供的。编译器不需要该关键字就能将其内联到定义它的文件中,因为它可以看到定义。您只需要inline关键字即可允许定义出现在多个翻译单元中,而不会导致多重定义错误。
| 归档时间: |
|
| 查看次数: |
204 次 |
| 最近记录: |