C99 和 C++ 内联函数的兼容定义

2023-12-05

我有一个 C++11 应用程序代码使用的 C99 代码实用程序库。一些内联函数以 C99 风格声明,并在翻译单元中显式生成代码,例如:

// buffer.h
inline bool has_remaining(void* obj) {
...
}

// buffer.c
extern inline bool has_remaining(void * obj);

但是,当我尝试使用has_remaining在 C++ 应用程序中,我在链接时收到有关多个定义的错误。看起来 g++ 正在实例化库中已经存在的内联代码,尽管extern "C"标头防护 说明符。

有没有办法强制 g++ 使用这种类型的定义?

看起来如果我#ifdef __cplusplus外部定义gnu_inline属性,正确的事情将会发生,但是肯定有一种更可移植的方法来保持现代 C 头文件与现代 C++ 兼容吗?

-- 编辑:工作示例 --

缓冲区.h:

#ifndef BUFF_H
#define BUFF_H

#include <stdbool.h>
#include <stddef.h>

#ifdef __cplusplus
extern "C" {
#endif

inline bool has_remaining(void const* const obj) {
    return (obj != NULL);
}

#ifdef __cplusplus
}
#endif

#endif /* BUFF_H */

缓冲区.c:

#include "buffer.h"

extern inline bool has_remaining(void const* const obj);

app.cpp:

#include <stdlib.h>
#include <stdio.h>

#include "buffer.h"

int main(int argc, char** argv) {
  char const* str = "okay";
  printf(str);

  has_remaining(str);

  return (0);
}

compile:

$ gcc -std=gnu99 -o buffer.o -c buffer.c
$ g++ -std=gnu++11 -o app.o -c app.cpp
$ g++ -Wl,--subsystem,console -o app.exe app.o buffer.o

buffer.o:buffer.c:(.text+0x0): multiple definition of `has_remaining'
app.o:app.cpp:(.text$has_remaining[_has_remaining]+0x0): first defined here
collect2.exe: error: ld returned 1 exit status

--编辑2-- The __gnu_inline__attribute 确实解决了多重定义的问题。我仍然希望看到一种(更)可移植的方法或一些为什么不存在的结论性推理。

#if defined(__cplusplus) && defined(NOTBROKEN)
#define EXTERN_INLINE extern inline __attribute__((__gnu_inline__))
#else
#define EXTERN_INLINE inline
#endif

EXTERN_INLINE bool has_remaining(void const* const obj) {
  return (obj != NULL);
}

这已报告给海湾合作委员会:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56066从这里开始讨论之后:http://gcc.gnu.org/ml/gcc-help/2013-01/msg00152.html

在 Linux 上,gcc 为内联函数发出弱符号,为 extern 内联函数发出强符号。在链接时,弱的被丢弃,有利于强的。显然,在 Windows 上,事情的处理方式有所不同。我没有任何使用 Windows 的经验,所以我不知道那里会发生什么。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C99 和 C++ 内联函数的兼容定义 的相关文章

  • 如何使 Windows 窗体的关闭按钮不关闭窗体但使其不可见?

    该表单有一个 NotifyIcon 对象 当用户单击 关闭 按钮时 我希望表单不关闭而是变得不可见 然后 如果用户想再次查看该表单 可以双击系统托盘中的图标 如果用户想关闭表单 可以右键单击该图标并选择 关闭 有人可以告诉我如何使关闭按钮不
  • 从父类调用子类方法

    a doStuff 方法是否可以在不编辑 A 类的情况下打印 B did stuff 如果是这样 我该怎么做 class Program static void Main string args A a new A B b new B a
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • 使闭包捕获的变量变得易失性

    闭包捕获的变量如何与不同线程交互 在下面的示例代码中 我想将totalEvents 声明为易失性的 但C 不允许这样做 是的 我知道这是错误的代码 这只是一个例子 private void WaitFor10Events volatile
  • 当 contains() 工作正常时,xpath 函数ends-with() 工作时出现问题

    我正在尝试获取具有以特定 id 结尾的属性的标签 like span 我想获取 id 以 国家 地区 结尾的跨度我尝试以下xpath span ends with id Country 但我得到以下异常 需要命名空间管理器或 XsltCon
  • C - 找到极限之间的所有友好数字

    首先是定义 一对友好的数字由两个不同的整数组成 其中 第一个整数的除数之和等于第二个整数 并且 第二个整数的除数之和等于第一个整数 完美数是等于其自身约数之和的数 我想做的是制作一个程序 询问用户一个下限和一个上限 然后向他 她提供这两个限
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • 如何返回 json 结果并将 unicode 字符转义为 \u1234

    我正在实现一个返回 json 结果的方法 例如 public JsonResult MethodName Guid key var result ApiHelper GetData key Data is stored in db as v
  • 在数据库中搜索时忽略空文本框

    此代码能够搜索数据并将其加载到DataGridView基于搜索表单文本框中提供的值 如果我将任何文本框留空 则不会有搜索结果 因为 SQL 查询是用 AND 组合的 如何在搜索 从 SQL 查询或 C 代码 时忽略空文本框 private
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • clang 实例化后静态成员初始化

    这样的代码可以用 GCC 编译 但 clang 3 5 失败 include
  • 将 unsigned char * (uint8_t *) 转换为 const char *

    我有一个带有 uint8 t 参数的函数 uint8 t ihex decode uint8 t in size t len uint8 t out uint8 t i hn ln for i 0 i lt len i 2 hn in i
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • 在 Dynamics CRM 插件中访问电子邮件发件人地址

    我正在编写一个 Dynamics CRM 2011 插件 该插件挂钩到电子邮件实体的更新后事件 阶段 40 pipeline http msdn microsoft com en us library gg327941 aspx 并且在此阶
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp
  • const、span 和迭代器的问题

    我尝试编写一个按索引迭代容器的迭代器 AIt and a const It两者都允许更改容器的内容 AConst it and a const Const it两者都禁止更改容器的内容 之后 我尝试写一个span
  • C 中的异或运算符

    在进行按位操作时 我在确定何时使用 XOR 运算符时遇到一些困难 按位与和或非常简单 当您想要屏蔽位时 请使用按位 AND 常见用例是 IP 寻址和子网掩码 当您想要打开位时 请使用包含或 然而 XOR 总是让我明白 我觉得如果在面试中被问

随机推荐

  • JQuery Mobile 文件上传[关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我一直在到处寻找 但找不到任何例子 有谁知道我在哪里可以找到有关使用 JQuery Mo
  • 将 Firestore 依赖项和类型导入到 node.js

    在今年的 FirebaseSummit 演讲之后 我最近将我的云函数更新为 TypeScript 我的所有代码看起来都很酷 但我在尝试恢复 Firestore API 的类型时遇到一些问题 例如QuerySnapshot DocumentR
  • CSS 加载时背​​景颜色过渡/滑过

    我发现一个 CSS 过渡在悬停时效果很好 它会将我的背景颜色滑过 但仅限于悬停时 CSS 有没有办法让这种情况在加载而不是悬停时发生 color FF0000 display inline block background color ff
  • 获取对象数组中相同值的计数

    假设我有一个对象数组 const apple bookName Harry Pottar part 1 bookName Harry Pottar part 2 bookName LOTR part 1 bookName LOTR part
  • Google Apps 脚本 e.namedValues 格式多项选择

    我有一个简单的脚本 用于通过电子邮件发送 Google 云端硬盘表单提交的结果 表格中的问题之一有多项选择复选框 我正在使用 e namedValues 来获取答案数组 以便我可以通过电子邮件发送给他们 如下所示 var multiple
  • 如何使用 Objective-C 在音频文件上添加回声效果

    我正在开发一个应用程序 我想在其中使用 Objective c 在录制的音频文件中添加回声效果 我正在使用 DIRAC 添加其他效果 例如男人对女人 慢 快 现在我必须用录制的声音制作机器人声音 对于机器人语音我需要添加回声效果 请帮我做到
  • 悬停时切换 div

    我有一个测试 UL 列表 如下所示 ul li First div li li Second div li li Third div li ul 并且 下面我有相关的 div 又名 div Content Here div div Cont
  • 在 Linux 上的 QFileDialog 中过滤可执行文件

    我正在尝试制作一个文件选择器来选择一个程序 可执行文件 我对 QDir 和 QFileDialog 文档的理解是 以下内容应该显示一个仅包含可执行文件的文件对话框 但是 即使目录中有可执行文件 它也根本不显示任何文件 也没有目录 self
  • 取消 Swift 中的定时事件?

    我想在事件发生后 10 秒内运行一段代码 但我希望能够取消它 这样如果在这 10 秒之前发生某些事情 代码将不会在 10 秒过去后运行 我一直在使用这个 但它是不可取消的 static func delay delay Double clo
  • 在 javascript es6 中编写全局 const 的正确方法是什么?

    在 javascript es6 的脚本中编写全局 const 并在其他脚本中使用它的正确方法是什么 你只需使用const在全球范围内 const aGlobalConstant 42 这就创建了一个全局常数 它不是全局对象的属性 因为co
  • 无法在Mac上使用PIL打开图像

    所以我有一个简短的 python 脚本 它接受表示图像的 base64 字符串 然后打开该图像的预览 这是我的脚本 usr local bin python3 from PIL import Image import sys import
  • ASP.NET:URI 处理

    我正在写一个方法 比方说 给定1 and hello应该返回http something com something 1 hello en I could将它们组合在一起非常容易 但是 ASP NET 3 5 为构建 URI 提供了哪些抽象
  • 如何获取两个日期之间的数据 REST Spring

    我的控制器映射 GetMapping fetch one date two date public List
  • 在没有管理员权限的情况下让 Sql Developer 在 Windows 上使用即时客户端?

    我已经在Win10 64位的企业PC上安装了Sqldeveloper版本19 1 64位版本 它可以与嵌入式 jdbc client 配合使用 但我需要使用 Oracle OCI client 使其正常工作 原因之一是更好地支持取消长时间运
  • 某些设备不支持SipApi

    我正在使用本机 sip api 在 android 应用程序中实现 sip 呼叫 它工作正常 但在某些设备 如 CANVAS 3 中它无法工作 调试后我发现这行代码正在返回NULL manager SipManager newInstanc
  • 为什么 TypeScript 不在回调中强制使用泛型参数?

    考虑这个使用 2 6 1 编译的 TypeScript 代码 function foo
  • 在管理新订单电子邮件模板中添加应用的优惠券代码 - WooCommerce

    让我澄清我的问题 我已下载并激活用于电子商务功能的 WooCommerce 插件 我想使用我的自定义插件在管理新订单电子邮件模板中添加 应用优惠券代码 Now 您能告诉我实际设置新订单电子邮件模板以便我覆盖它的确切钩子或函数吗 你能告诉我如
  • 使用 xml.etree.ElementTree 在 Python 中简单遍历 dom

    例如 考虑解析一个pom xml file
  • 锁屏时如何显示Activity?

    我的应用程序在汽车对接事件中启动 我想在插入设备时唤醒手机 由系统完成 并解锁屏幕 是否可以 我用于将活动提升到最高水平 private Window wind Override protected void onResume TODO A
  • C99 和 C++ 内联函数的兼容定义

    我有一个 C 11 应用程序代码使用的 C99 代码实用程序库 一些内联函数以 C99 风格声明 并在翻译单元中显式生成代码 例如 buffer h inline bool has remaining void obj buffer c e