将 API 函数参数从 'char *' 更改为"const char *"有哪些潜在问题?

What are the potential issues with changing an API function parameter from 'char *' to 'const char *'?

本文关键字:char 问题 const 函数 API 参数      更新时间:2023-10-16

如果我有这样的 API 函数声明:

void fn(char * s);

我在以后的修订版中将其更改为:

void fn(const char * s);

这会破坏二进制兼容性吗?这会破坏以前有效的东西吗?这种类型的更改有什么问题吗?

请注意,即使在第一次修订中,该参数也始终被视为常量。

如果函数被声明为 extern "C",它可能无关紧要,如果不是,则可能无关紧要。

对于C++函数,参数类型是签名的一部分,因此对于采用const char *的函数和采用简单char *的函数,损坏的名称将不同。并且由于该名称解析将失败,而无需重新生成代码。

但是,C 不对参数类型进行编码,因此无论哪种方式,名称都是相同的。

在任何一种情况下,实际代码都可能是相同的,与const char *相比,它是一个char *的事实不会改变元素的访问方式。

void fn(char * s)void fn(const char * s)在C++中是完全不同的函数。这与更改其名称相同。您绝对应该保存旧的,但将其重定向到新的。

struct silly{
  operator char*()const{ return 0;}
  operator char const*() const{ return "hello"; }
};