赞
踩
目录
前面一章节简单的介绍了extern "C"的基本概念就是有时候在C++工程中可能需要将某些函数按照C的风格来编译,在函数前加extern "C",意思是告诉编译器,将该函数按照C语言规则来编译。
这一章将进行详细介绍其用法,为了更好地了解,下面将举个OJ题实例:
题目: 有效括号
解这道题需要我们自己写个栈,但是这里为了讲解extern "C"的用法,将把栈一系列操作写好编译到静态库中然后进行调用:
- bool isValid(char* s) {
- ST st;
- StackInit(&st);
- int i = 0;
- while (s[i])
- {
- //左括号就插入
- if (s[i] == '(')
- {
- StackPush(&st, ')');
- }
- else if (s[i] == '{')
- {
- StackPush(&st, '}');
- }
- else if (s[i] == '[')
- {
- StackPush(&st, ']');
- }
- else
- {
- //if (st.empty())//栈里为空,且现在为右括号就直接返回false
- // return false;
- if (!StackEmpty(&st) && StackTop(&st) == s[i])
- {
- StackPop(&st);
- }
- else
- {
- StackDestroy(&st);
- return false;
- }
- }
- i++;
- }
-
- if (StackEmpty(&st))
- {
- StackDestroy(&st);
- return true;
- }
- else
- {
- StackDestroy(&st);
- return false;
- }
-
- }
-
- int main()
- {
- char str1[] = "{[]}";
- char str2[] = "([)]";
- printf("%d\n", isValid(str1));
- printf("%d\n", isValid(str2));
- return 0;
- }
静态库,目前我还不太清楚,后面会在linux中跟大家一起探讨,现在咱们就理解成别人写好给你用的,被编译好的程序.
先创建一个空项目,把之前写的栈放进去,然后打开项目属性,把.exe属性改为静态库(lib)属性即可:
编译后运行,静态库就完成了。
C程序调用C写的静态库,显然没有任何阻碍可以正常操作,同理C++程序调用C++写的静态库也不会有问题,这里就不带大家一起操作了。下面我将讲解C++调用C写的静态库 和C调用C++写的静态库的操作。
调用库之前我们要做如下操作:
第一步:
第二步:
然后下面就可以操作起来了.
C++调用C写的静态库
首先需要包含头文件(创建栈静态库的路径)
#include "../stack/stack/stack.h"
.表示当前目录
..表示上一层目录
然后我们来运行一下:
这里出现了链接错误,通过前一章函数重载的学习我们很快会发现问题的所在:C++修饰函数名的方法与C修饰函数名方法不一样,导致在静态库找不到这些函数,因此我们引出了:extern "C"
这段代码的意思是:告诉编译器在调用这个静态库时,调用函数使用C的风格去调用(即调用函数时不使用函数名修饰规则)
这样我们就可以正常运行了:
首先我们把先前C++的项目后缀改成 .c,把静态库的c文件改成cpp,我们试着反着来调用,会发生什么。
很显然C程序无法调用C++静态库中函数名被修饰的函数
所以我们需要在C++静态库中使用extern "C",因为c程序中无法识别extern "c"
我们这里介绍两种方法来修改:
第一种:
- #ifdef __cplusplus
- extern "C"
- {
- #endif
- //初始化栈
- void StackInit(Stack* ps);
- //销毁栈
- void StackDestroy(Stack* ps);
- //压栈
- void StackPush(Stack* ps, STDatatype x);
- //出栈
- void StackPop(Stack* ps);
- //取出栈顶元素
- STDatatype StackTop(Stack* ps);
- //栈的大小
- int StackSize(Stack* ps);
- //判断栈是否为空
- bool StackEmpty(Stack* ps);
- #ifdef __cplusplus
- }
- #endif
第二种:
- #ifdef __cplusplus
- #define EXTERN_C extern "C"
- #else
- #define EXTERN_C
- #endif
- //初始化栈
- EXTERN_C void StackInit(Stack* ps);
- //销毁栈
- EXTERN_C void StackDestroy(Stack* ps);
- //压栈
- EXTERN_C void StackPush(Stack* ps, STDatatype x);
- //出栈
- EXTERN_C void StackPop(Stack* ps);
- //取出栈顶元素
- EXTERN_C STDatatype StackTop(Stack* ps);
- //栈的大小
- EXTERN_C int StackSize(Stack* ps);
- //判断栈是否为空
- EXTERN_C bool StackEmpty(Stack* ps);
现在就可以正常运行了:
以上是extern "C" 的详细操作,有不足的地方或者对代码有更好的见解,欢迎评论区留言共同商讨,共同进步!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。