现在的位置: 首页 > 综合 > 正文

C中没有函数重载!

2013年09月27日 ⁄ 综合 ⁄ 共 1796字 ⁄ 字号 评论关闭

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的编译方法来编译!??

期待高手来帮小菜解决这个问题。

【上篇】
【下篇】

抱歉!评论已关闭.