error C2011: 'fd_set' : 'struct' type redefinition 的原因(转)

本文转自:http://hi.baidu.com/pro_lily/item/d3da0dc28a3d48bd0d0a7b54

网友这样说
"
一直都用gcc开发,好久没有用VC,前两天写代码的时候装了一大堆插件,visual Assist X,WndTabs,Spelly,Project Line Counter,SourceStyler C++,用的挺爽的,感觉比VI好用多了,但是一编译,噩梦就开始了。
语法错误到不多,很快就改好了。

接下来就遇到了一个错误
error C2065: 'TryEnterCriticalSection' : undeclared identifier
很奇怪,同时关键段的其他函数没有这样的问题,偏偏只有这个函数有,只好求助于google,发现需要添加一个宏定义,_WIN32_WINNT=0x500,意思应该就是只从某一版本的windows开始支持,好像是win2000,以前的就不需要支持了,这样就可以支持一些新的函数,我想这个TryEnterCriticalSection就应该是其中之一。

这个问题没有了,又出了新的问题,一下子跳出了很多error C2011。
就像这个一样 error C2011: 'fd_set' : 'struct' type redefinition,而且还有提示winsock.h和winsock2.h中的定义冲突macro redefinition。
开始以为这个问题就是重复定义,可以找了半天没有发现winsock2.h的影子,就很奇怪,查了网上的帖子也没有发现这样的情况,其他人虽然有相同的错误,但是大多都是使用了stdafx.h,里面的定义冲突了,记得以前写VC的时候,项目建造的时候可以选是否支持网络,但是这次我建的是一个空的windows console项目,没有使用,所以还是没办法。查了半天还是没有结果。突然一时好奇想看看_WIN32_WINNT=0x500这个宏会带来什么样的变化,于是我就查了一下这方面的资料,没想到在windows.h里发现这样一段代码
#if(_WIN32_WINNT >= 0x0400)
#include \<winsock2.h\>
#include \<mswsock.h\>
#else
#include \<winsock.h\>
#endif
哈哈,怪不得重复定义呢,把包含的头文件winsock.h改成了windows.h,问题解决了。

接下来又是
error C2065: '_beginthreadex' : undeclared identifier
error C2065: '_endthreadex' : undeclared identifier
奇怪,怎么会不支持多线程的呢,正好手头还有一个以前的项目里面也用到了这两个函数,对比了一下项目文件,发现有个选项是/MLd,原来的那个项目里是/MDd,我直接在项目文件里改过来,发现问题解决,后来在project Settings->C/C++->code generation->use run-time library里面发现了是否支持多线程的选择。

编译全通过了,没想到link还是除了问题,明明有个函数声明和定义都有了,但是link就是找不到,出现了几个error LNK2001: unresolved external symbol,而且也不知道该google什么关键字,看来一些可能产生error LNK2001的原因,没一个合适我,后来还是一个同时帮了我,原来是我用了一个以前自己写的文件,文件的扩展名一定是.c,而不是.cpp。一般C++编译器对.c文件使用C方式编译,对.cpp文件使用C++方式编译(编译器会自动定义__cplusplus)。而C++的I/O流只能在C++编译方式下工作。
有两个方法解决最简单的是改文件扩展名为.cpp。
或者在头文件里的函数声明部分加这样的东西
#ifdef __cplusplus

extern "C"{

#endif


函数申明
#ifdef __cplusplus

};

#endif
我用了第一个方法,又发现了setsockopt这个函数的小问题,原来是C++编译器对类型转化比C来的严格造成的。

终于程序可以跑了起来,看来VC虽然比GCC用起来方便,但是很多东西都掩藏在预处理和工具的设置上,改起来很不方便,像那个/MDd表示可以debug的多线程库,根本无法直接理解,不像用GCC的时候,全是在makefile中写清楚,就算不懂,但是很容易理解,改起来也比较方便。不过好在这些开发环境的问题不会太多,遇到过了以后就好了。

"

这个问题还是比较普遍,我的做法是在 windows.h 前先 winsock2.h
#include \<winsock2.h\>
#include \<windows.h\>

你可能感兴趣的:(多线程,c,windows,struct,makefile,编译器)