在看代码的时候,我们会时不时就会看到这样的代码
-
#ifdef __cplusplus
-
extern "C" {
-
#endif
-
-
//代码
-
-
#ifdef __cplusplus
-
}
-
#endif
这样的代码有什么用处呢?可能对于一些初学者来说,都不知道这用来做什么的。下面就来讲讲这个的用处。
extern “c”的作用就是为了在c++代码中能够调用之前编译过的c代码。不知道这样说准不准确,这是我现在对extern “c”的理解。
下面通过一个例子让我们来理解extern “c”的用法。
首先创建一个extern_c.c文件,一个extern_c.h文件,一个main.cpp文件
这里的是main.cpp文件中调用了extern_c.c文件中的函数。也是c++函数调用了c函数。
main.cpp里面的内容
-
#include <iostream>
-
#include "extern_c.h"
-
-
using namespace std;
-
-
int main(void)
-
{
-
int a;
-
a = add(4,5);
-
-
cout <<a<<endl;
-
}
extern_c.h
里面的内容是
-
#ifndef _EXTERN_C_H
-
#define _EXTERN_C_H
-
#if 0
-
#ifdef __cplusplus
-
extern "C" {
-
#endif
-
#endif
-
-
int add(int x,int y);
-
-
#if 0
-
#ifdef __cplusplus
-
}
-
#endif
-
#endif
-
-
#endif
extern_c.c里面的内容是
-
#include "extern_c.h"
-
-
int add(int x,int y)
-
{
-
return (x+y);
-
}
extern_c.c用gcc编译器编译,main.cpp用g++编译器编译,编译结果如下:
编译会报错, undefined reference to `add(int, int)',找不到add(int, int)。
但是如果把extern_c.h改成
-
#ifndef _EXTERN_C_H
-
#define _EXTERN_C_H
-
#if 1
-
#ifdef __cplusplus
-
extern "C" {
-
#endif
-
#endif
-
-
int add(int x,int y);
-
-
#if 1
-
#ifdef __cplusplus
-
}
-
#endif
-
#endif
-
-
#endif
再次编译运行:
这次就能成功编译运行,也许很多人都不知道怎么回事,怎么就加了个extern “c” {}就可以运行了。
为了更好的说明这个现象。下面把把它们编译成目标文件,看下目标文件都有哪些符号?
在没有用extern “c”的情况下
gcc编译出来的int add(int x,int y);的符号是add,g++编译出来的int add(int x,int y);是_Z3addii。
而
在用了extern “c”的情况下,
g++编译出来的int add(int x,int y);add。
原因一目了然。
不爽---------------------------------------------------------------------------
阅读(1271) | 评论(0) | 转发(0) |