c - 如何为发布版本内联一个函数

标签 c function inline c-preprocessor

// 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/

相关文章:

c - 从 C 中的输入整数集中查找最大素数

c - 如果项目 A 位于同一个工作区中,项目 A 如何使用项目 B 的库(即指令)?

python - 定义列表时意外调用的函数

javascript - JavaScript 函数中的拆分和替换

c - 无法使用 gdb 将客户端进程附加到 postgresql 服务器

c - 链接器可复制的含义

赋值运算符中的 C++ 函数求值顺序

Django表单通过多对多字段链接2个模型

html - 响应式图像容器

javascript - 与顺风动态内联更改类属性