您的位置:首页 > 编程语言 > C语言/C++

C++对于函数名重载的要点以及extren "C"

2017-08-09 15:17 393 查看
感觉自己不断的在学东西,又不断的在忘东西,所以及时的总结还是很有必要的,现在学习NDK,先把之前遗忘的c++再掏出来回忆一下。

重载要点

c语言是不支持函数名重载的,然而c++支持重载,c++重载的实现类似于在函数名后加个后缀,比如:

void func(char a);                  // func_c(char a)
void func(char a, int b, double c); //func_cid(char a, int b, double c)


关于函数重载的规则大部分语言都类似,我就不多提了,注意的一点是C++ 允许,int 到long 和double 隐式类型转换。遇到这种情型,则会引起二义性。比如: 有两个函数print(int a); print(char a);就会造成起义

error: call of overloaded 'print(int)' is ambiguous
print(1); // print(int)
error: call of overloaded 'print(char)' is ambiguous
print('a'); // print(int)


解决方法就是在调用的时候强转一下,这里和java就有点区别了。

extern “C”

函数倾轧发生在两个阶段,.cpp的编译阶段,.h的声明阶段。只有两个阶段同事进行才能匹配调用。

这里我们看标准的用法:

mystring.h

extern "C" {
int myStrlen(char *str);
}


mystring.cpp

#include "mystring.h"
int myStrlen(char *str)
{
int len = 0;
while(*str++)
len++;
return len;
}


#include <iostream>
#include "mystring.h"
using namespace std;
int main()
{
char *p = "china";
int len;
len = myStrlen(p);
return 0;
}


这样在.h头文件中定义的使用的时候就都是不倾轧的。如果把mystring.cpp稍作修改:

//#include "mystring.h"
int myStrlen(char *str)
{
int len = 0;
while(*str++)
len++;
return len;
}


这时候就无法通过编译了,因为h文件是生命了不参加倾轧的,而cpp里的方法在最后被倾轧了,这样就会导致无法找到对应的函数。jni中的函数都是要声明externc的,目的也是防止函数名被c++处理了而无法找到函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐