// common.h
// This is foo function. It has a body.
__inline void foo() { /* something */ }
// a.cpp
#include "common.h" // for foo function
// Call foo
// b.cpp
#include "common.h" // for foo function
// Call foo
我只想在为发布构建时内联 foo 函数。我不想为 Debug
构建内联函数。
我试过了,但链接器错误让我很恼火。
在这种情况下,foo
函数的主体定义在 common.h 头文件中。
所以如果我这样做
//common.h
#if !defined(_DEBUG)
__inline
#endif
void foo() { /* something */ }
在 DEBUG
构建中会遇到链接错误。因为两个模块试图包含 common.h。
我不知道如何解决它。
可能吗?
最佳答案
“简单”的解决方案是这样的:
#if !defined(_DEBUG) || defined(NDEBUG)
#define INLINE inline
#else
#define INLINE static
#endif
static
是消除链接错误和绕过单一定义规则所必需的。
一个更好的解决方案是简单地在整个项目范围内禁用内联以进行调试。 GCC 支持 -wno-inline-functions
和 -fno-inline-small-functions
选项来抵消这些优化,它也不为 -O1
或更低版本启用内联(可能还有 -Os
)。大多数编译器都有类似的选项。
我称后者为更好的解决方案,因为它应该指示编译器忽略 inline
提示,从而消除对讨厌的预处理器指令的需要。
关于c - 如何为发布版本内联一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4622529/