zoukankan      html  css  js  c++  java
  • Ogre::UINT 与 其他库的 类型冲突问题

    今天 为 使用 Ogre 开发的游戏前端 添加网络操作, 导入 网络应用库时出现了 类型冲突,

    网络应用库定义了 UINT:
    
    // basetype.h
    ...
    typedef unsigned int UINT;
    
    
    // ExampleApplication.h
    ...
    using namespace Ogre;
    
    // net.h
    ...
    UINT port ; //无法决策
    
    // main.cpp
    #include "basetype.h"
    #include "ExampleApplication.h"
    #include "net.h"

    编译时  和 Ogre::UINT 冲突, 是编译器 无法决策使用哪个 类型,开始的第一种解决方案是 修改 Ogre 的 ExampleApplication.h 等文件, 使不使用

    using namespace Ogre;

    但这样就 修改了 Ogre; 第二种方式是修改 原本的 net 网络应用库, 使 自定义的的 UINT 在 命名空间 myLib 下:

    // basetype.h
    ...
    namespace myLib
    {
        typedef unsigned int UINT;
    };
    
    
    并在使用时(尤其在 h 文件中), 用 full 方式使用:
    // net.h
    ...
    myLib::UINT port ;

    不错, 这样 Ogre 编写的这个游戏前端能够有效编译, 但是 在编译另外一个 只使用 网络引用库时, 编译出错, 出现

    UINT : 不明确的符号
    可能是 D:program filesmicrosoft sdkswindowsv7.0aincludewindef.h(173) : unsigned int UINT” 
    或 basetype.h  : myLib::UINT

    在一看 网络应用库的实现代码中 通篇 都是 using namespace MyLib ; 语句, 是 MyLib 的 UINT 污染了 windef.h 的UINT 声明, 就和上面的 Ogre::UINT 的 using namespace Ogre 冲突与 UINT, 为此需要修改 网络应用库的 各个文件, 使都明确使用  myLib::UINT, 但是一旦某个文件中使用了

    using namespace MyLib, 问题还是存在, 所以 不适用 using namespace xxx 语句, 同时为了书写方便, 最终 网络应用库修改成:

    声明类型时使用 命名空间:
    namespace myLib
    {
         typedef unsigned int UINT;  
    }
    
    // net.h
    声明时, 使用全名称:
    myLib::UINT port;
    
    void func( myLib::UINT  ID);
    
    // net.cpp
    定义时, 在函数内部使用 using myLib::UINT:
    void func( myLib::UINT ID )
    {
          using MyLib::UINT;
    
          UINT tempID = ID;
    }
  • 相关阅读:
    02 : python 基础语法,流程控制语句
    10 : mysql 主从复制
    docker Dockerfile 参数讲解
    docker service 创建swarm节点服务
    docker image 删除未使用的镜像
    docker config 创建配置文件
    docker wait 命令使用
    docker update 更新容器信息
    docker top 命令使用
    docker tag 修改镜像的标枪
  • 原文地址:https://www.cnblogs.com/Wilson-Loo/p/3511232.html
Copyright © 2011-2022 走看看