zoukankan      html  css  js  c++  java
  • [转][c++][跨平台]c++跨平台开发小结

    转自:https://blog.csdn.net/dj0379/article/details/53577135

    linux编程与windows编程的差异之处:

         1. 文件与目录的大小写以及路径分隔符的差别

         windows下不区分大小写,路径分隔符一般使用"/";linux下区分大小写,路径分隔符使用"/"。

         2. itoa()函数在linux下并不存在

         所以使用类似sprintf();之类的函数是个不错的替代。(为什么说是类似函数,看下面一条啦)

         3. _snprintf()与_vsnprintf()的差别

         sprintf()不能检查目标字符串的长度,可能造成众多安全问题,所以都会推荐使用snprintf()。

    int _snprintf( 
       char * buffer, 
       size_t count , 
       const char * format [ , 
        argument] . . . 
    ) ;

          例如,要把c2字符串write给c1,比较安全的用法: 

    char c1[ 256] ; 
    c1[ sizeof ( c1) - 1] = 0; 
    _snprintf( c1, sizeof ( c1) , "%s" , c2) ; 
    if ( c1[ sizeof ( c1) - 1] ! = 0) 
    { 
       cout < < "warning: string is truncated" ) < < endl ; 
        c1[ sizeof ( c1) - 1] = 0; 
    }

          如果在write之前主动检查一下c2的长度再申请c1的空间当然是最好的。

         4. 在linux下并不存在std::exception(char*),可以使用logic_error类型代替exception

         5. 尽量使用STL与标准C库,并且要按照标准C++语法来写程序

          比如这种用法list< type1<T0> >::iterator iter;在windows下的编译器下没有编译错误;但在linux下,就需要在前面增加typename才能顺利编译通过。

         6. 在源文件最后多加一个或几行的空行,以免蹦出警告:"no newline at end of file"

         7. windows中对ini文件进行操作的所有函数在linux下都没有对应函数

          建议自己写一个操作ini文件的类,在STLChina上有一个使用stl制作这种类的原理介绍和一小段代码片段,自己扩充一下。

         8. SOCKET对象集要使用fd_set,不要使用FD_SET

         9. stricmp()函数,在linux下用strcasecmp()函数替换

         10. 在linux下不存在INVALID_SOCKET、INVALID_HANDLE_VALUE、SOCKET_ERROR、MAX_PATH、INFINITE、STILL_ACTIVE等宏定义

         11. 参数要求为char*的时候别忘了给传进去的string加一个.c_str()函数

         12. linux下不存在目录操作时要包含的direct.h与io.h头文件,而要包含相应的unistd.h与fcntl.h头文件

         13. filelength()函数在linux也不存在,可以通过fstat()函数来替代

          使用文件与目录操作函数,不要使用类似_access带下划线的函数,取而代之有access函数可以通用。

         14. #prgram once预编译指令在linux下并不起作用,请使用以下标准方式来解决头文件多次包含问题 :

    # ifndef _XXXXX_H_
    # define _XXXXX_H_
    # endif

         15. hash_map出现在后期版本的stl库,为兼顾hasp与tree map,请可以通过以下宏来解决 :

    // process hash_map
    
    # if defined( _MSC_VER) 
    # if _MSC_VER > = 1300
    // hasp_map not standard Container
    
    # pragma warning( disable: 4996) 
    # include < hash_map> 
    // we believe _STLP_STRING included means using STLPORT
    
    # elif defined( _STLP_STRING) 
    # include < hash_map> 
    # else 
    # define hash_map map 
    # endif 
    # endif

         16. 为了区别不同OS,一般可用的几个宏有:WIN32,__linux__,需要使用与OS相关的内容,请一定用开关来写

         17. 对于界面操作部分代码,一定要把它与程序逻辑核心代码用宏分开来,这样的代码才好移植,不要交错

         18. 不要假定可执行文件一定有如.exe的扩展名

         19. 在父类中用typedef定义的类型,在子类并不能直接使用

         20. long类型的变量在32位和64位Windows上都是4个字节,而在64位Linux系统上占8字节。

    另附:

    linux网络编程常用头文件:

    sys/types.h:数据类型定义

    sys/socket.h:提供socket函数及数据结构

    netinet/in.h:定义数据结构sockaddr_in

    arpa/inet.h:提供IP地址转换函数

    netdb.h:提供设置及获取域名的函数

    sys/ioctl.h:提供对I/O控制的函数

    sys/poll.h:提供socket等待测试机制的函数


    其他在网络程序中常见的头文件 
    unistd.h:提供通用的文件、目录、程序及进程操作的函数

    errno.h:提供错误号errno的定义,用于错误处理

    fcntl.h:提供对文件控制的函数

    time.h:提供有关时间的函数

    crypt.h:提供使用DES加密算法的加密函数

    pwd.h:提供对/etc/passwd文件访问的函数

    shadow.h:提供对/etc/shadow文件访问的函数

    pthread.h:提供多线程操作的函数

    signal.h:提供对信号操作的函数

    sys/wait.h、sys/ipc.h、sys/shm.h:提供进程等待、进程间通讯(IPC)及共享内存的函数

     

    在编写网络程序时,可以直接使用下面这段头文件代码

    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netdb.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #include <errno.h>
    #include <malloc.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <sys/ioctl.h>
    #include <stdarg.h>
    #include <fcntl.h>
    #include <fcntl.h>


    涉及到用户权限及密码验证问题时加入如下语句:
    #include <shadow.h>
    #include <crypt.h>
    #include <pwd.h> 
    需要注意的是,应该在编译时链接加密算法库,即增加编译选项:
    -lcrypt

     

    涉及到文件及时间操作加入如下语句: 
    #include <sys/time.h>
    #include <utime.h>
    #include <time.h>
    #include <sys/stat.h>
    #include <sys/file.h>


    涉及到多进程操作时加入如下语句: 
    #include <sys/wait.h>
    #include <sys/ipc.h>
    #include <sys/shm.h>
    #include <signal.h>


    涉及到多线程操作时加入如下语句: 
    #include <pthread.h>
    #include <sys/poll.h>
    需要注意的是,应该在编译时链接线程库,即增加编译选项:-lthread

  • 相关阅读:
    在浏览器应用中使用 gRPC
    gRPC 客户端工厂集成
    gRPCurl 测试 gRPC 服务
    links
    Flex布局
    使用 IHttpClientFactory 实现复原 HTTP 请求
    Dex Common
    Dex MVVM
    日志
    配置
  • 原文地址:https://www.cnblogs.com/lyggqm/p/9109294.html
Copyright © 2011-2022 走看看