Search code examples
c++backwards-compatibilityabi

Does adding an arguments with default values to functions break ABI?


The title says all. I'm going to add an argument to a member function of a class with a default value. The argument is of a non-trivial type. Does this break ABI? Let's say my new library version is going to be M.m.0 and it should be available as a drop-in replacement for all linked applications that use M.m-1.x.

Sample code:

// 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: I did my own test, and it's working. Just can't be sure


Solution

  • Most C++ ABIs encode the argument types of [member] functions in the symbol name. Default arguments are typically implemented as temporary objects conjured up at the point of call. If these are the choices done for the ABI used, adding a default argument will change the ABI. Whether that is the case you'll need to determine with the specific ABI used.