当前位置:编程学习 > C/C++ >>

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语言 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,