C++对于函数名重载的要点以及extren "C"
2017-08-09 15:17
393 查看
感觉自己不断的在学东西,又不断的在忘东西,所以及时的总结还是很有必要的,现在学习NDK,先把之前遗忘的c++再掏出来回忆一下。
关于函数重载的规则大部分语言都类似,我就不多提了,注意的一点是C++ 允许,int 到long 和double 隐式类型转换。遇到这种情型,则会引起二义性。比如: 有两个函数print(int a); print(char a);就会造成起义
解决方法就是在调用的时候强转一下,这里和java就有点区别了。
这里我们看标准的用法:
mystring.h
mystring.cpp
这样在.h头文件中定义的使用的时候就都是不倾轧的。如果把mystring.cpp稍作修改:
这时候就无法通过编译了,因为h文件是生命了不参加倾轧的,而cpp里的方法在最后被倾轧了,这样就会导致无法找到对应的函数。jni中的函数都是要声明externc的,目的也是防止函数名被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++处理了而无法找到函数。
相关文章推荐
- C/C++知识要点4——printf函数以及cout的计算顺序
- 【c++面试题】c++中函数的重载,c++程序中调用C编译器编译后的函数为什么要加extern "C 4000 "
- C++对于运算符*或者+等的重载,函数返回对象需要加const吗?
- extern "C" c++如何实现函数的重载
- 详解C++中的函数调用和下标以及成员访问运算符的重载
- 详解C++中的函数调用和下标以及成员访问运算符的重载
- C++为什么可以进行函数重载以及引起的二义性问题
- C++之普通成员函数、虚函数以及纯虚函数的区别与用法要点
- C/C++知识要点4——printf函数以及cout的计算顺序
- C++父类子类间函数重定义,虚函数重写(覆盖)以及重载
- C++之普通成员函数、虚函数以及纯虚函数的区别与用法要点
- C++普通函数与模板函数以及特化函数重载的优先级问题
- C++:成员函数的重写、重载以及多态
- c++中多态函数以及函数重载,覆盖,遮蔽(隐藏)的区别
- C/C++知识要点3——类成员函数的重载、覆盖和隐藏的区别
- C++函数重载实现的原理以及为什么在C++中调用C语言编译的函数时要加上extern "C"声明
- c++初识以及函数重载
- c++中多态函数以及函数重载,覆盖,遮蔽(隐藏)的区别
- C/C++中函数的调用约定(__cdecl, __stdcall)以及extern, extern “C"的详细解释
- C++之普通成员函数、虚函数以及纯虚函数的区别与用法要点