【问题标题】:Does adding an arguments with default values to functions break ABI?向函数添加具有默认值的参数是否会破坏 ABI?
【发布时间】:2017-01-20 12:39:44
【问题描述】:

标题说明了一切。我将向具有默认值的类的成员函数添加一个参数。该参数属于非平凡类型。这会破坏 ABI 吗?假设我的新库版本将是 M.m.0,它应该可以作为所有使用 M.m-1.x 的链接应用程序的替代品。

示例代码:

// These are some classes: base and child : public base

/* Version 1.2.3 */
class foo() {
public:
   void do_that_stuff(const std::string a);
}

/* Version 1.3.0 */
class foo() {
public:
   void do_that_stuff(const std::string a, const base& b = base());
}

PS:我做了自己的测试,它工作正常。只是不能确定

【问题讨论】:

  • 这个名字说明了一切。默认参数是arguments,与函数类型(特别是函数参数)无关。
  • “这会破坏 ABI 吗?” 对不起?
  • do_that_stuff 将在新旧编译中得到不同的名称 - 我认为这违反了我对 ABI 兼容性的定义。

标签: c++ backwards-compatibility abi


【解决方案1】:

大多数 C++ ABI 在符号名称中编码 [member] 函数的参数类型。默认参数通常实现为在调用点产生的临时对象。如果这些是针对所使用的 ABI 所做的选择,则添加默认参数将更改 ABI。是否是这种情况,您需要确定使用的特定 ABI。

【讨论】:

  • 出于好奇,您知道一个不会被此更改破坏的 ABI 吗??
  • @Oliv:我不知道。但是,ABI可以为具有默认参数的函数生成多个符号。这几乎是在不破坏 ABI 的情况下更改类的方法(假设修改后的函数不是 virtual):相反,如果使用默认参数,则可以在调用另一个转发所有参数并添加默认参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-26
  • 1970-01-01
相关资源
最近更新 更多