如果我有这样的 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"; }
};