在目标代码中,它通过添加有关参数的信息来更改名称。这里应用的技术称为名称修改。 C++ 没有标准化的名称重整技术。因此不同的编译器使用不同的技术。
下面是名称重整的示例。重载函数被命名为 func(),还有另一个函数 my_function()。
int func(int x) {
return x*x;
}
double func(double x) {
return x*x;
}
void my_function(void) {
int x = func(2); //integer
double y = func(2.58); //double
}
某些 C++ 编译器会像下面这样更改它 –
int __func_i(int x) {
return x*x;
}
double __func_d(double x) {
return x*x;
}
void __my_function_v(void) {
int x = __func_i(2); //integer
double y = __func_d(2.58); //double
}
C不支持函数重载,所以当我们在C++中链接C代码时,我们必须确保符号的名称没有改变。以下 C++ 代码将生成错误。
int printf(const char *format,…);
main() {
printf(“Hello World”);
}
undefined reference to `printf(char const*, …)’
ld returned 1 exit status
产生此问题的原因是编译器更改了 printf() 的名称。并且它没有找到更新后的 printf() 函数的定义。为了解决这个问题,我们必须在C++中使用extern“C”。当此块内使用某些代码时,C++ 编译器会确保函数名称未被破坏。所以这个名字不会改变。所以上面的代码就会像这样来解决这个问题。
extern “C” {
int printf(const char *format,…);
}
main() {
printf(“Hello World”);
}
Hello World
注意:这些代码块可能在不同的编译器中生成不同的结果。
如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!
添加我为好友,拉您入交流群!
请使用微信扫一扫!