c语言延时函数中,我把经常要用的函数写到了.cpp的文件中,当我在写另一个.cpp的程序时,怎么调用经常要用的函数

C中没有函数重载
学习C/C++这么多年,我却被一种坑爹的知识点轮奸了好多回!
&函数的重载,一直都是C的标准!&????????
你是否也深深的被这个想法侵蚀,是否觉得C语言里面有,函数的重载是件天经地义的事!
那么我现在要恭喜你,你也中标了!
标准的C语言里,没有函数的重载。
以下代码都是在vs2010编译器下 &
extern &C& &
void MyTestFun(int nArray) &
& & printf(&MyTestFun\n&); &
void MyTestFun(char *strArray) &
& & printf(&MyTestFun:%s\n&,strArray); &
//编译器会报错 &error C2733: second C linkage of overloaded function 'MyTestFun' not allowed &
不仅仅如此,而且&一个函数名只能有一个定义,但是可以有多种申明。
一个函数名只能有一个定义,但是可以有多种申明,和调用
如:程序A &
& & //在一个stdafx.cpp文件中定义 &
& & extern &C& &
& & & & void MyTestFun(int n) &
& & & & { &
& & & & & & printf(&MyTestFun: %d&, n); &
& & & & } &
& & //在另一个cpp文件里不同的申明和调用,当然申明和调用必须一致(必须在于上一个不同的cpp文件中) &
& & extern &C& void MyTestFun( int, int ); & &
& & int _tmain(int argc, _TCHAR* argv[]) &
& & & & MyTestFun(1 , 2); &
& & & & return 0; &
//输出结果:MyTestFun: 1 &
_tmain函数就是一个标准的C函数
我们的_tmain函数就是一个标准的C函数,所以我们的_tmain函数就可以定义为如下多种形式:
int _tmain(void);
int _tmain(int argc)
int _tmain(int argc, _TCHAR* argv[])
int _tmain(int argc, _TCHAR* argv[],wchar_t * envp[])
1)在tchar.h文件里将_tmain宏定义:#define _tmain & & &main &
2)在internal.h文件里申明和调用了wmain &
extern &C& &
int __CRTDECL wmain(_In_ int _Argc, _In_count_(_Argc) _Pre_z_ wchar_t ** _Argv, _In_z_ wchar_t ** _Env); &
__declspec(noinline) &
__tmainCRTStartup( &
& & & & void &
& & & & ) &
#ifdef RFLAG &
& & & & & & __winitenv = &
& & & & & & mainret = wmain(argc, argv, envp); &
#else &/* WPRFLAG */ &
& & & & & & __initenv = &
& & & & & & mainret = main(argc, argv, envp); &
#endif &/* WPRFLAG */ &
我 有一个问题
但是我有一个问题,就是,如果我们上面的程序A变成如下程序B:
stdafx.cpp中 &
void MyTestFun(int n)//定义是不定义为C函数 &
printf(&MyTestFun: %d&, n); &
另一个cpp中 &
extern &C& void MyTestFun( int, int ); &&
int _tmain(int argc, _TCHAR* argv[]) &
MyTestFun(1 , 2); &
return 0; &
//这样编译通不过,error LNK2019: unresolved external symbol _MyTestFun referenced in function _wmain &
很明显,c和c++的函数编译时都会在函数名上做手脚(这也是C++函数重载的实现方法),但做手脚的方法不一样,
定义和声明的MyTestFun()函数在编译器做完做完手脚后名字就不一样了,所以编译器找不到MyTestFun()函数的定义,
但是_tmain()的定义没有加extern &C&却不会有这种情况,是不是编译器将_tmain()做了特殊处理,是不是在编译器里设置下就可以指定我们的函数也能像_tmain一样让函数编译在cpp文件里按c的编译方法来编译!??
您对本文章有什么意见或着疑问吗?请到您的关注和建议是我们前行的参考和动力&&
您的浏览器不支持嵌入式框架,或者当前配置为不显示嵌入式框架。应该将自己的库函数保存在VC6.0软件的什么地方呢?请教各位,多谢!
写在一个头文件里,下次用的时候包含一下
我只说一句:扔掉 VC6.0 吧,那简直是万恶之源。
前端工程师程序设计利用VC调用动态链接库中的函数 - 游戏程序设计 - 云世界日志
当前位置:
&&>&&&&>&&&&>&&正文
程序设计利用VC调用动态链接库中的函数
14:16:34&&&&
评论(0)&&&&
阅读(1783)
  自从微软推出16位的Windows操作系统起,此后每种版本的Windows操作系统都非常依赖于动态链接库(DLL)中的函数和数据,实际上Windows操作系统中几乎所有的内容都由DLL以一种或另外一种形式代表着,例如显示的字体和图标存储在GDI DLL中、显示Windows桌面和处理用户的输入所需要的代码被存储在一个User DLL中、Windows编程所需要的大量的API函数也被包含在Kernel DLL中。在Windows操作系统中使用DLL有很多优点,最主要的一点是多个应用程序、甚至是不同语言编写的应用程序可以共享一个DLL文件,真正实现了资源"共享",大大缩小了应用程序的执行代码,更加有效的利用了内存;使用DLL的另一个优点是DLL文件作为一个单独的程序模块,封装性、独立性好,在软件需要升级的时候,开发人员只需要修改相应的DLL文件就可以了,而且,当DLL中的函数改变后,只要不是参数的改变,程序代码并不需要重新编译。这在编程时十分有用,大大提高了软件开发和维护的效率。  既然DLL那么重要,所以搞清楚什么是DLL、如何在Windows操作系统中开发使用DLL是人员不得不解决的一个问题。本实例针对这些问题,通过一个简单的例子,即调用在一个DLL中函数,实现用户输入数据的自加功能,全面地解析了在Visual C++编译环境下编程实现DLL、调用DLL中的函数的过程。程序编译运行后的界面效果如图一所示:图一、调用DLL中的函数实现数据自加功能程序效果图  一、实现方法  1、DLL的概念  DLL是建立在客户/服务器通信的概念上,包含若干函数、类或资源的库文件,函数和数据被存储在一个DLL(服务器)上并由一个或多个客户导出而使用,这些客户可以是应用程序或者是其它的DLL。DLL库不同于静态库,在静态库情况下,函数和数据被编译进一个二进制文件(通常扩展名为*.LIB),Visual C++的编译器在处理程序代码时将从静态库中恢复这些函数和数据并把他们和应用程序中的其他模块组合在一起生成可执行文件。这个过程称为"静态链接",此时因为应用程序所需的全部内容都是从库中复制了出来,所以静态库本身并不需要与可执行文件一起发行。在动态库的情况下,有两个文件,一个是引入库(.LIB)文件,一个是DLL文件,引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址,这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。从上面的说明可以看出,DLL和.LIB文件必须随应用程序一起发行,否则应用程序将会产生错误。  微软的Visual C++支持三种DLL,它们分别是Non-MFC Dll(非MFC动态库)、Regular Dll(常规DLL)、Extension Dll(扩展DLL)。Non-MFC DLL指的是不用MFC的类库结构,直接用C语言写的DLL,其导出的函数是标准的C接口,能被非MFC或MFC编写的应用程序所调用。Regular DLL:和下述的Extension Dlls一样,是用MFC类库编写的,它的一个明显的特点是在源文件里有一个继承CWinApp的类(注意:此类DLL虽然从CWinApp派生,但没有消息循环),被导出的函数是C函数、C++类或者C++成员函数(注意不要把术语C++类与MFC的微软基础C++类相混淆),调用常规DLL的应用程序不必是MFC应用程序,只要是能调用类C函数的应用程序就可以,它们可以是在Visual C++、Dephi、Visual Basic、Borland C等编译环境下利用DLL开发应用程序。常规DLL又可细分成静态链接到MFC和动态链接到MFC上的,这两种常规DLL的区别将在下面介绍。与常规DLL相比,使用扩展DLL用于导出增强MFC基础类的函数或子类,用这种类型的动态链接库,可以用来输出一个从MFC所继承下来的类。扩展DLL是使用MFC的动态链接版本所创建的,并且它只被用MFC类库所编写的应用程序所调用。例如你已经创建了一个从MFC的CtoolBar类的派生类用于创建一个新的工具栏,为了导出这个类,你必须把它放到一个MFC扩展的DLL中。扩展DLL 和常规DLL不一样,它没有一个从CWinApp继承而来的类的对象,所以,开发人员必须在DLL中的DllMain函数添加初始化代码和结束代码。  2、动态链接库的创建  在Visual C++6.0开发环境下,打开File\New\Project选项,可以选择Win32 Dynamic-Link Library或MFC AppWizard[dll]来以不同的方式来创建Non-MFC Dll、Regular Dll、Extension Dll等不同种类的动态链接库。  (一) Win32 Dynamic-Link Library方式创建Non-MFC DLL动态链接库  每一个DLL必须有一个入口点,这就象我们用C编写的应用程序一样,必须有一个WINMAIN函数一样。在Non-MFC DLL中DllMain是一个缺省的入口函数,你不需要编写自己的DLL入口函数,用这个缺省的入口函数就能使动态链接库被调用时得到正确的初始化。如果应用程序的DLL需要分配额外的内存或资源时,或者说需要对每个进程或线程初始化和清除操作时,需要在相应的DLL工程的.CPP文件中对DllMain()函数按照下面的格式书写。BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved){ switch( ul_reason_for_call ) {  case DLL_PROCESS_ATTACH:   .......  case DLL_THREAD_ATTACH:   .......  case DLL_THREAD_DETACH:   .......  case DLL_PROCESS_DETACH:   ....... } return TRUE;}   参数中,hMoudle是动态库被调用时所传递来的一个指向自己的句柄(实际上,它是指向_DGROUP段的一个选择符);ul_reason_for_call是一个说明动态库被调原因的标志,当进程或线程装入或卸载动态链接库的时候,操作系统调用入口函数,并说明动态链接库被调用的原因,它所有的可能值为:DLL_PROCESS_ATTACH: 进程被调用、DLL_THREAD_ATTACH: 线程被调用、DLL_PROCESS_DETACH: 进程被停止、DLL_THREAD_DETACH: 线程被停止;lpReserved为保留参数。到此为止,DLL的入口函数已经写了,剩下部分的实现也不难,你可以在DLL工程中加入你所想要输出的函数或变量了。  我们已经知道DLL是包含若干个函数的库文件,应用程序使用DLL中的函数之前,应该先导出这些函数,以便供给应用程序使用。要导出这些函数有两种方法,一是在定义函数时使用导出关键字_declspec(dllexport),另外一种方法是在创建DLL文件时使用模块定义文件.Def。需要读者注意的是在使用第一种方法的时候,不能使用DEF文件。下面通过两个例子来说明如何使用这两种方法创建DLL文件。  1)使用导出函数关键字_declspec(dllexport)创建MyDll.dll,该动态链接库中有两个函数,分别用来实现得到两个数的最大和最小数。在MyDll.h和MyDLL.cpp文件中分别输入如下原代码://MyDLL.hextern "C" _declspec(dllexport) int Max(int a, int b);extern "C" _declspec(dllexport) int Min(int a, int b);//MyDll.cpp#include#include"MyDll.h"int Max(int a, int b){ if(a&=b) else  }int Min(int a, int b){ if(a&=b) else  }   该动态链接库编译成功后,打开MyDll工程中的debug目录,可以看到MyDll.dll、MyDll.lib两个文件。LIB文件中包含DLL文件名和DLL文件中的函数名等,该LIB文件只是对应该DLL文件的"映像文件",与DLL文件中,LIB文件的长度要小的多,在进行隐式链接DLL时要用到它。读者可能已经注意到在MyDll.h中有关键字"extern C",它可以使其他编程语言访问你编写的DLL中的函数。  2)用.def文件创建工程MyDll  为了用.def文件创建DLL,请先删除上个例子创建的工程中的MyDll.h文件,保留MyDll.cpp并在该文件头删除#include MyDll.h语句,同时往该工程中加入一个文本文件,命名为MyDll.def,再在该文件中加入如下代码:  LIBRARY MyDll  EXPORTS  Max  Min  其中LIBRARY语句说明该def文件是属于相应DLL的,EXPORTS语句下列出要导出的函数名称。我们可以在.def文件中的导出函数后加@n,如Max@1,Min@2,表示要导出的函数顺序号,在进行显式连时可以用到它。该DLL编译成功后,打开工程中的Debug目录,同样也会看到MyDll.dll和MyDll.lib文件。 (二)MFC AppWizard[dll]方式生成常规/扩展DLL  在MFC AppWizard[dll]下生成DLL文件又有三种方式,在创建DLL是,要根据实际情况选择创建DLL的方式。一种是常规DLL静态链接到MFC,另一种是常规DLL动态链接到MFC。两者的区别是:前者使用的是MFC的静态链接库,生成的DLL文件长度大,一般不使用这种方式,后者使用MFC的动态链接库,生成的DLL文件长度小;动态链接到MFC的规则DLL所有输出的函数应该以如下语句开始: AFX_MANAGE_STATE(AfxGetStaticModuleState( )) //此语句用来正确地切换MFC模块状态  最后一种是MFC扩展DLL,这种DLL特点是用来建立MFC的派生类,Dll只被用MFC类库所编写的应用程序所调用。前面我们已经介绍过,Extension DLLs 和Regular DLLs不一样,它没有一个从CWinApp继承而来的类的对象,编译器默认了一个DLL入口函数DLLMain()作为对DLL的初始化,你可以在此函数中实现初始化,代码如下:BOOL WINAPI APIENTRY DLLMain(HINSTANCE hinstDll,DWORD reason ,LPVOID flmpload){ switch(reason) {  ……………//初始化代码; } }   参数hinstDll存放DLL的句柄,参数reason指明调用函数的原因,lpReserved是一个被系统所保留的参数。对于隐式链接是一个非零值,对于显式链接值是零。  在MFC下建立DLL文件,会自动生成def文件框架,其它与建立传统的Non-MFC DLL没有什么区别,只要在相应的头文件写入关键字_declspec(dllexport)函数类型和函数名等,或在生成的def文件中EXPORTS下输入函数名就可以了。需要注意的是在向其它开发人员分发MFC扩展DLL 时,不要忘记提供描述DLL中类的头文件以及相应的.LIB文件和DLL本身,此后开发人员就能充分利用你开发的扩展DLL了。   3、动态链接库DLL的链接  应用程序使用DLL可以采用两种方式:一种是隐式链接,另一种是显式链接。在使用DLL之前首先要知道DLL中函数的结构信息。Visual C++6.0在VC\bin目录下提供了一个名为Dumpbin.exe的小程序,用它可以查看DLL文件中的函数结构。另外,Windows系统将遵循下面的搜索顺序来定位DLL: 1.包含EXE文件的目录,2.进程的当前工作目录, 3.Windows系统目录, 4.Windows目录,5.列在Path环境变量中的一系列目录。  (一)隐式链接  隐式链接就是在程序开始执行时就将DLL文件加载到应用程序当中。实现隐式链接很容易,只要将导入函数关键字_declspec(dllimport)函数名等写到应用程序相应的头文件中就可以了。下面的例子通过隐式链接调用MyDll.dll库中的Min函数。首先生成一个项目为TestDll,在DllTest.h、DllTest.cpp文件中分别输入如下代码://Dlltest.h#pragma comment(lib,"MyDll.lib")extern "C"_declspec(dllimport) int Max(int a,int b);extern "C"_declspec(dllimport) int Min(int a,int b);//TestDll.cpp#include#include"Dlltest.h"void main(){  a=min(8,10) printf("比较的结果为%d\n",a);}   在创建DllTest.exe文件之前,要先将MyDll.dll和MyDll.lib拷贝到当前工程所在的目录下面,也可以拷贝到windows的System目录下。如果DLL使用的是def文件,要删除TestDll.h文件中关键字extern "C"。TestDll.h文件中的关键字Progam commit是要Visual C+的编译器在link时,链接到MyDll.lib文件,当然,开发人员也可以不使用#pragma comment(lib,"MyDll.lib")语句,而直接在工程的Setting-&Link页的Object/Moduls栏填入MyDll.lib既可。  (二)显式链接  显式链接是应用程序在执行过程中随时可以加载DLL文件,也可以随时卸载DLL文件,这是隐式链接所无法作到的,所以显式链接具有更好的灵活性,对于解释性语言更为合适。不过实现显式链接要麻烦一些。在应用程序中用LoadLibrary或MFC提供的AfxLoadLibrary显式的将自己所做的动态链接库调进来,动态链接库的文件名即是上述两个函数的参数,此后再用GetProcAddress()获取想要引入的函数。自此,你就可以象使用如同在应用程序自定义的函数一样来调用此引入函数了。在应用程序退出之前,应该用FreeLibrary或MFC提供的AfxFreeLibrary释放动态链接库。下面是通过显式链接调用DLL中的Max函数的例子。#include #includevoid main(void){ typedef int(*pMax)(int a,int b); typedef int(*pMin)(int a,int b); HINSTANCE hDLL; PMax Max HDLL=LoadLibrary("MyDll.dll");//加载动态链接库MyDll.dll文件; Max=(pMax)GetProcAddress(hDLL,"Max"); A=Max(5,8); Printf("比较的结果为%d\n",a); FreeLibrary(hDLL);//卸载MyDll.dll文件;}   在上例中使用类型定义关键字typedef,定义指向和DLL中相同的函数原型指针,然后通过LoadLibray()将DLL加载到当前的应用程序中并返回当前DLL文件的句柄,然后通过GetProcAddress()函数获取导入到应用程序中的函数指针,函数调用完毕后,使用FreeLibrary()卸载DLL文件。在编译程序之前,首先要将DLL文件拷贝到工程所在的目录或Windows系统目录下。  使用显式链接应用程序编译时不需要使用相应的Lib文件。另外,使用GetProcAddress()函数时,可以利用MAKEINTRESOURCE()函数直接使用DLL中函数出现的顺序号,如将GetProcAddress(hDLL,"Min")改为GetProcAddress(hDLL, MAKEINTRESOURCE(2))(函数Min()在DLL中的顺序号是2),这样调用DLL中的函数速度很快,但是要记住函数的使用序号,否则会发生错误。  二、编程步骤  1、 启动Visual C++6.0,分别生成一个"Non-MFC Dll"动态链接库项目和基于对话框的项目,分别命名为"DLL"和"Test";  2、 在DLL项目中定义并导出一个函数"extern "C" _declspec(dllexport) int Test(int i)",该函数实现了变量的"自加"功能;  3、 按照图一所示设计应用程序"Test"的界面,添加一个编辑框,用于用户输入一个变量;添加一个"Test"按钮,用来测试DLL函数中的调用;  4、 添加代码,分别编译两个程序,并将最终生成的DLL文件复制到"Test"项目的"Debug"目录下,最后运行"Test"程序。  三、程序代码///////////////////////////////////////////////////////////////////////// DLL.cpp : Defines the initialization routines for the DLL.#include "stdafx.h"#include "DLL.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endifBEGIN_MESSAGE_MAP(CDLLApp, CWinApp) //{{AFX_MSG_MAP(CDLLApp) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code! //}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CDLLApp constructionCDLLApp::CDLLApp(){} /////////////////////////////////////////////////////////////////////////////// The one and only CDLLApp objectCDLLApp theAextern "C" _declspec(dllexport) int Test(int i){ AFX_MANAGE_STATE(AfxGetStaticModuleState()); return ++i;}/////////////////////////////////////////////////////////////////////////DLL.def文件; DLL.def : Declares the module parameters for the DLL.LIBRARY "DLL"DESCRIPTION 'DLL Windows Dynamic Link Library'EXPORTS////////////////////////////////////////////////////////////void CTestDlg::OnBtest() { UpdateData(true); typedef int(_cdecl *Connect)(int i); HINSTANCE hinstDLL=NULL;  hinstDLL=LoadLibrary("dll.dll"); if (hinstDLL) {  Connect P  Proc = (Connect)GetProcAddress (hinstDLL,"Test");  int iValue = Proc(m_i);  FreeLibrary(hinstDLL);  char * p = new char[10];  sprintf(p,"%d",iValue);  AfxMessageBox(p); } else {  AfxMessageBox("没找到dll"); }}   四、小结  在文介绍了DLL技术,并给出了调用DLL中函数的实现代码,仿效这个例子,还可以编制出更多的适合自己应用系统所需的DLL,例如,用于数据采集卡的端口操作及扩展内存区访问、视频区缓冲区及BIOS数据区操作等许多实际应用的编程任务。必要时只需直接更新DLL,而用不着对应用程序本身作任何改动就可以对应用程序的功能和用户接口作较大的改善,实现版本升级。因此,掌握好DLL技术对Windows者很有裨益。
游戏程序设计相关文章&&问题点数:0&&回复次数:2&&&
c/c++,怎么在一个.c或者.cpp文件中识别出一个函数??
现在遇到一个问题,是这样的:本人想在一个.c或者.cpp文件中,识别出所有函数。
比如有个NF_Frame.c文件,如下内容:
* FUNCTION
*&&NF_SetDialogScreen
* DESCRIPTION
*&&设置窗口屏幕大小
* PARAMETERS
*&&int sween_width 宽
*&&int sween_height 高
void NF_SetDialogScreen(int sween_width, int sween_height)
&&& if(NAV_SCREEN_HORIZONTAL == NF_GetScreenMode())
&&&&&&&&navi_screen_max_x = sween_height - 1;
&&&&&&&&navi_screen_max_y = sween_width - 1;
&&& }&&&&&&
我想写个算法识别出这样一个函数。麻烦高手支招,本人不胜感激。
搜索更多相关主题的帖子:
来 自:AVATAR
等 级:黑侠
帖 子:260
专家分:506
我的想法:这个属于基本的文件字符处理问题,首先,打开文件,然后按字符流进行读取,依次读入单个字符进行处理,函数一般都是 type function{ }这样的写法,当然也要考虑预处理命令、结构体类型定义等字符的处理,这些没用的字符在处理过程中跳过即可,不予以统计。具体函数的处理就是依据函数的特性 “类型 函数名 左花括号 右花括号”来进行字符处理和统计就行了。
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
什么叫识别函数啊&&&你是不是模仿编译器的识别功能&&去识别别人写的文件里面的函数?
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
===========深入&-----------------&浅出============
版权所有,并保留所有权利。
Powered by , Processed in 0.023589 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights Reserved当前位置: >
> C语言中关于文件内容删除的问题我们都知道可以用fprintf,fwrite等函数向文件里写东西,但
C语言中关于文件内容删除的问题我们都知道可以用fprintf,fwrite等函数向文件里写东西,但
jasidmon & at
C语言中关于文件内容删除的问题我们都知道可以用fprintf,fwrite等函数向文件里写东西,但是要删除文件的内容该怎么办呢?比如这段代码[code=C/C++][/code]#include &stdio.h&#include &stdlib.h&void main(void){ FILE * if((fp = fopen(&StrType.txt&,&w&)) == NULL) {
printf(&Cannot open file!&);
exit(0); } fprintf(fp,&%s %s&,&csv&,&dsv&); fclose(fp); char a[10],b[10]; if((fp = fopen(&StrType.txt&,&r&)) == NULL) {
printf(&Cannot open file!&);
exit(0); } fscanf(fp,&%s%s&,a,b); printf(&%s,%s\n&,a,b); fclose(fp);}这是向文件StrType里写入两个字符串&csv&和&dsv&,但要是从文件里删除该怎么做呢?
把需要的先读出来,写到一个文件中,不需要的跳过,处理完关闭保存。如果要写到原文件中的话,这时可以先删除原文件,再读写一次文件就行了。因不能创建同名文件所以要先删除原文件jasmine_b325 & &
& & (0)(0)
本问题标题:
本问题地址:
温馨提示:本问题已经关闭,不能解答。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&&&湘教QS2-164&&增值电信业务经营许可证湘B2-

我要回帖

更多关于 c语言字符串函数大全 的文章

 

随机推荐