84669 personnes étudient
152542 personnes étudient
20005 personnes étudient
5487 personnes étudient
7821 personnes étudient
359900 personnes étudient
3350 personnes étudient
180660 personnes étudient
48569 personnes étudient
18603 personnes étudient
40936 personnes étudient
1549 personnes étudient
1183 personnes étudient
32909 personnes étudient
有时在C++ 中调用有关操作系统的函数时,需要不同的头文件,(例如Sleep()函数window下在头文件windows.h,Linux下是system.h并且函数名的S改为小写),这样容易产生两份不同的代码,有没有办法再同一份代码下兼容两个平台?
Sleep()
windows.h
system.h
S
业精于勤,荒于嬉;行成于思,毁于随。
平台的差异,都需要自己去封装了
void Sleep(const unsigned int milliseconds) { #ifdef _WIN32 ::Sleep(milliseconds); #else usleep(milliseconds * 1000); #endif }
这个问题基本是所有语言都会遇到的问题,就算如JAVA一次编译到处运行,那也是虚拟机帮助掩盖了各种不同平台的实现细节,留给上层的只有统一的接口。虽然c++标准库没有提供对应的解决方案,不过#ifdef之类的宏设施可以帮助我们跨越不同的平台,如果工作量很大,对于c++简单的使用第三方的跨平台库也可以,工作量小建议自己稍微封装就可以了。第三方可以使用boost、QT等库,对于简单的sleep,c++11标准模板库是有提供的std::this_thread::sleep_for
#ifdef
boost
QT
c++11标准模板库
可以用boost library: http://www.boost.org/ 各个API都进行了跨平台的包装。
任何关于代码的问题都可以通过添加层来解决。
用宏。ifdef判断是不是win32, 不是则define Sleep(xxxxx) sleep(xxxx/1000)
或者直接用libc的函数
还有一种,用cygwin编译,不过这样会有依赖dll
封装。对所有可能出现平台问题的函数自己封装,然后用条件编译进行区分。你说的sleep只是个简单的问题,复杂的比如socket的很多细节都不同。
可以用 tbox + xmake ,完美跨平台开发。。
http://xmake.iohttp://tboox.org
平台的差异,都需要自己去封装了
这个问题基本是所有语言都会遇到的问题,就算如JAVA一次编译到处运行,那也是虚拟机帮助掩盖了各种不同平台的实现细节,留给上层的只有统一的接口。
虽然c++标准库没有提供对应的解决方案,不过
#ifdef
之类的宏设施可以帮助我们跨越不同的平台,如果工作量很大,对于c++简单的使用第三方的跨平台库也可以,工作量小建议自己稍微封装就可以了。第三方可以使用
boost
、QT
等库,对于简单的sleep,c++11标准模板库
是有提供的std::this_thread::sleep_for可以用boost library: http://www.boost.org/ 各个API都进行了跨平台的包装。
任何关于代码的问题都可以通过添加层来解决。
用宏。
ifdef判断是不是win32, 不是则define Sleep(xxxxx) sleep(xxxx/1000)
或者直接用libc的函数
还有一种,用cygwin编译,不过这样会有依赖dll
封装。对所有可能出现平台问题的函数自己封装,然后用条件编译进行区分。你说的sleep只是个简单的问题,复杂的比如socket的很多细节都不同。
可以用 tbox + xmake ,完美跨平台开发。。
http://xmake.io
http://tboox.org