C中有函数重载吗?你是否中标了?
-----jiese1990
学习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) int __tmainCRTStartup( void ) { ... #ifdef WPRFLAG __winitenv = envp; mainret = wmain(argc, argv, envp); #else /* WPRFLAG */ __initenv = envp; mainret = main(argc, argv, envp); #endif /* WPRFLAG */ ... } ... }
我 有一个问题
但是我有一个问题,就是,如果我们上面的程序A变成如下程序B:
程序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的编译方法来编译!??
期待高手来帮小菜解决这个问题。