C中没有函数重载
学习C/C++这么多年,我却被一种坑爹的知识点易做图了好多回!
“函数的重载,一直都是C的标准!”????????
你是否也深深的被这个想法侵蚀,是否觉得C语言里面有,函数的重载是件天经地义的事!
那么我现在要恭喜你,你也中标了!
标准的C语言里,没有函数的重载。
[cpp]
以下代码都是在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
不仅仅如此,而且"一个函数名只能有一个定义,但是可以有多种申明。
一个函数名只能有一个定义,但是可以有多种申明,和调用
[cpp]
如:程序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[])
....
[cpp]
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:
[cpp]
程序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的编译方法来编译!??
补充:软件开发 , C语言 ,