一个关于extern"C"下函数指针行为的测试用例

本例测试在VS2008下extern "C" 对函数名以及函数指针的影响.

//test.h

#ifndef TEST_H

#define TEST_H

#include <iostream>

 

#define BUFSIZE 1024

 

#ifdef __cplusplus

extern "C"{

#endif

extern "C" void(*pf2)(void);

void pf3(void (*)(void));

void extern_c_test();

//void extern_c_test(int a);//不能在extern "C"中进行函数重载,这是c所不允许的。

typedef void(* FC)(void);

void pf5(FC);

#ifdef __cplusplus

}

#endif

 

typedef void(*FCpp)(int);

extern void(*pf)(void);

void pf4(void(*)(void));

void pf5(FC c_func);

void pf6(FCpp cpp_func);

void extern_cpp_test();

void extern_cpp_test(int);

void extern_c_test(int);//这里对extern_c_test进行了重载,这是一个以c++名称修饰规则进行修饰的函数。即是一个c++函数。

 

#endif

 

 

//test.c

#include "gloabal.h"//包含一些库头文件

#include "test.h"

 

void(*pf)(void);

void (*pf2)(void);

 

void pf3(void (*)(void)){

printf("This is a C function with a param of a point to a C function.\n");

return;

}

 

void pf4(void(*)(void)){

using std::cout;

using std::endl;

 

cout<<"this is a C++ function with a param of a point to a C++ function."<<endl;

return;

}

 

void pf5(FC c_func){

printf("========Start of pf5(FC c_func)===============\n");

printf("This is a C++ function with a param of a point to a C function.\n");

c_func();

printf("========End of pf5(FC c_func)================\n");

printf("\n");

return;

}

 

void pf6(FCpp cpp_func){

using std::cout;

using std::endl;

 

cout<<"\n";

cout<<"========Start of pf6(FC c_func)===============\n";

cout<<"this is a C++ function with a param of a point to a C++ function.\n";

cpp_func(7);

cout<<"========End of pf6(FC c_func)================\n";

cout<<"\n"<<endl;

return;

}

 

void extern_c_test(){

printf("This is a C function : extern_c_test()\n");

//fn();

return;

}

 

void extern_c_test(int a){

printf("This is a C function with a int %d for param : extern_c_test(int)\n",a);

return;

}

 

void extern_cpp_test(){

using std::cout;

using std::endl;

cout<<"This is a C++ function no param : extern_cpp_test()"<<endl;

return;

}

 

void extern_cpp_test(int a){

using std::cout;

using std::endl;

 

cout<<"This is a C++ function with a int "<<a<<" for param : extern_cpp_test(int)"<<endl;

 

return;

}

 

//main.c

#include "gloabal.h"

#include "test.h"

 

int main(int argc, char **argv){

using namespace std;

 //编译器根据形参模式选择具体的extern_c_test版本:

/*①对于pf5 选择 extern_c_test( );声明为:extern "C" void extern_c_test();是一个用c符号修饰的函数。*/

 

/*②对于pf6 选择 extern_c_test(int);声明为:void extern_c_test();是一个用c++符号修饰的函数。*/

 

pf5(extern_c_test);

pf6(extern_c_test);

 

 

/*③对于pf5 选择 extern_cpp_test( );声明为:void extern_cpp_test();是一个用c++符号修饰的函数。这里编译能通过。但是对于pf5的声明为:

extern "C" void pf5(FC);

而对于FC的声明为:

extern"C" typedef void( * FC)(void),即将其声明为一个c的函数指针,将一个c++函数名传给pf5,可见,这里编译器只对函数类型进行了检查,并没有对具体怎么修饰函数名进行关注。*/

 

/*④对于pf6 选择 extern_cpp_test(int);声明为:void extern_cpp_test(int);是一个用c++符号修饰的函数。*/

 

pf5(extern_cpp_test);

pf6(extern_cpp_test);

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值