学习笔记内容来自:狄泰软件学院 唐佐林老师 的视频,十分感谢您的指导
函数重载遇上函数指针:
将重载函数名赋值给函数指针时:
1.根据重载规则挑选与函数指针参数列表一致的候选者
2.严格匹配候选者的函数类型与函数指针的函数类型,即函数的返回值类型也要匹配
比如:
int func(int a)
{
return a;
}
int func(int a,int b)
{
return a+b;
}
void func(int a)
{
std::cout<<a<<std::endl;
}
typedef int(*PFUNC)(int a)
当调用PFUNC p = func;时,匹配的是第一个函数
注意:
1.函数重载必然发生在同一个作用域中
2.编译器需要用参数列表或函数返回值类型进行函数选择
3.无法直接通过函数名得到重载函数的入口地址
正确做法为:
printf(“%p\n”,int(*)(int)func);
printf(“%p\n”,int(*)(int,int)func);
printf(“%p\n”,void(*)(int)func);
C++和C相互调用
1.实际工程中C++和C代码相互调用是不可避免的
2.C++编译器能够兼容C语言的编译方式
3.C++编译器会优先使用C++编译的方式
4.extern关键字(在C++里才有)能强制让C++编译器进行C方式的编译
extern “C”
{
//code...
}
比如:
在add.h文件中:
int add(int a,int b);
在add.c文件中:
int add(int a,int b)
{
return a+b;
}
以上两个文件都是C语言的,当我们在C++文件中要引用add.h头文件时,如在main.cpp中,
#include <stdio.h>
extern “C”
{
#include “add.h”
}
int main()
{
int c = add(1,2);
printf(“c = %d\n”,c);
return 0;
}
这样才编译通过,否则编译器指出函数未定义,因为add函数是在add.c中定义而不是add.cpp
如何保证C的代码一定以C编译器的方式编译呢?
答:_cplusplus宏是C++编译器里的一个标准宏,所有C++编译器都有,利用这个特性,可以这样做:
#ifdef _cplusplus
extern “C”
{
#endif
//C code...
#ifdef _cplusplus
}
#endif
注意事项
1.C++编译器不能以C的方式编译重载函数
2.编译方式决定函数名被编译后的目标名
3.C++编译方式将函数名和参数列表编译成目标名
4.C编译方式只将函数名做为目标名编译