来源:http://bbs.mjtd.com/thread-102486-1-1.html

另,ObjectARX编程参考:http://bbs.mjtd.com/forum-14-1.html

如果你打算升级你的ARX或者想在同一个IDE(譬如vs2010)编译多个版本的ARX,那么我希望这篇帖子对你有帮助
首先你应该简单了解Objectarx开发的版本对应情况:
R15   --- 2000-2002  --- objectarx 2000,2002   --- vc6.0
R16   --- 2004-2006   --- objectarx 2004-2006   --- vc7.0
R17   --- 2007-2009  --- objectarx 2007-2009   --- vc8.0
R18   --- 2010-2012  --- objectarx 2010-2012   --- vc9.0
R19   --- 2013-2014(目前)  --- objectarx 2013,2014   --- vc10.0

1.字符问题
这个是最普遍的问题
R17及其以上版本,必须以UNICODE编译。意味着绝大部分的字符串都应当以_T包围起来,譬如以前写的:

普通浏览复制代码保存代码打印代码
  1. acutPrintf ("hello");

代码应当改写为:

普通浏览复制代码保存代码打印代码
  1. acutPrintf (_T("hello"));

固然也可以写成

普通浏览复制代码保存代码打印代码
  1. acutPrintf (L"hello");

不过这样在多重目标编译时候你不能向下兼容了。
char 的类型需要改成TCHAR类型
然后所对应的跟字符串有关的函数都需要做相对应的修改:
譬如 strcpy 应当改为 _tcscpy ; strcmp要改为_tcscmp;或者相应的unicode函数。
关于如何知道他们想对应的形式,可以用google搜索关键字:
例如 "strcpy msdn"
一般来说第一个链接应该就是:
http://msdn.microsoft.com/zh-cn/library/kk6xf663(v=vs.80).aspx
然后就可以得到相应的

TCHAR.H     _tcscpy
未定义      strcpy
_MBCS       _mbscpy
_UNICODE    wcscpy

因而,你应当包含TCHAR.H
不过一般情况下这个文件已经包含了。

另外在vs2008或者vs2010上编译R16或者以下版本,可能要检查以下编译配置:
C/C++->general-->use UNICODE Response files 这个地方可能要设置为No
C/C++->Treat wchar_t as Built-in Type  这个地方要设置为NO
Linker的General也是如此。

2. for 循环问题

由 vc6升级来的程序,如下for循环可以在vc6下成立:

普通浏览复制代码保存代码打印代码
  1. for (int i = 0;i< n;i++)
  2. {...}
  3. return i;

但是对于其上版本,不成立,会出现编译错误:
error C2065: 'i' : undeclared identifier
for循环内定义的i一旦放在外面,则视作未定义符号。它的作用域仅仅在于循环内。

因而有两种办法:
第一种:修改代码,把 i定义到循环外面:

普通浏览复制代码保存代码打印代码
  1. int i;
  2. for (i=0;i;i++)
  3. ...

...

第二种:修改C/C++编译配置,把force confromance in for loop scope 修改为NO
建议按第一种来,修改代码,使得符合C++  标准。(VC6只有不到80%的符合C++标准)

3. 4430问题
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

在VC6中,如果没有显示的指定返回值类型,编译器将其视为默认整型;但是vs2002及以上不支持默认整型. 这个错

误,解决方法如下:
打开project->BaseClasses properties->configuration->C/C++ ->Command Line,增加/wd4430选项。
或者在文件里面(一般来说是stdafx.h)添加 #pragma warning(disable: 4430)

4. 版本定义问题

在一些程序中,必须将

普通浏览复制代码保存代码打印代码
  1. #ifndef WINVER
  2. #define WINVER 0x0400
  3. #endif

修改为

普通浏览复制代码保存代码打印代码
  1. #ifndef WINVER
  2. #define WINVER 0x0501
  3. #endif

因为有的版本的arx 最低版本为xp,意味着在windows 2000及其以下均不获支持。

5. 模式定义(.def)文件和一些库文件
在R2004的版本 上,基本不需要.def
但如果为使得你的程序向下兼容,可以设置.def,并在附加依赖库上添加rxapi.lib
另外,随着版本的升级,其中 objectarx的一些库文件也发生了变化。需用户自己检查。
在高版本,基本可以不添加什么附加依赖项。

6.如何让多重目标的编译自动适应各个版本:

可以这样做:
在project->BaseClasses properties->configuration->C/C++ ->;Preprocessor (预处理指令)
中添加 ADS = 16 之类,16这里代表版本号R16。
然后在代码中增加如下判断:
#if (ADS<16)
//R2004以下版本执行的代码
#else
//R2004以上版本执行的代码
#endif

7.一些虚函数的变化和升级
譬如在自定义实体时可能碰到的错误:
error C3248: 'AcGiDrawable::worldDraw': function declared as 'sealed' cannot be overridden by

'XXX_Entity::worldDraw'

你应当加如下判断:

普通浏览复制代码保存代码打印代码
  1. //ADS按照上面设置
  2. #if(ADS>17)
  3.         virtual Adesk::Boolean subWorldDraw(AcGiWorldDraw *mode) ;
  4.         virtual void subViewportDraw(AcGiViewportDraw * mode);
  5. #else
  6.         virtual Adesk::Boolean worldDraw(AcGiWorldDraw *mode) ;
  7.         virtual void viewportDraw(AcGiViewportDraw * mode);
  8. #endif

R18及其以上版本用subWorldDraw代替了worldDraw,等等。

8.预编译头问题。
在一些旧的版本,CPP文件可能都按照默认设置为 Not using precompiled headers (不使用预编译头)
应当改成 Use(/YU),stdafx.cpp改成 Create(/YC)
这样一来可以极大地提高编译速度,二来减少一些升级时带来的问题。
待续。。。

arx移植 及预处理器的更多相关文章

  1. 前端CSS预处理器Sass

    前面的话   "CSS预处理器"(css preprocessor)的基本思想是,用一种专门的编程语言,进行网页样式设计,然后再编译成正常的CSS文件.SASS是一种CSS的开发工 ...

  2. css预处理器sass使用教程(多图预警)

    css预处理器赋予了css动态语言的特性,如变量.函数.运算.继承.嵌套等,有助于更好地组织管理样式文件,以及更高效地开发项目.css预处理器可以更方便的维护和管理css代码,让整个网页变得更加灵活可 ...

  3. C和指针 第十四章 预处理器 头文件

    编写一个C程序,第一个步骤称为预处理,预处理在代码编译之前,进行一些文本性质的操作,删除注释.插入被include的文件.定义替换由#define定义的符号,以及确定代码的部分内容是否应该按照条件编译 ...

  4. 关于前端CSS预处理器Sass的小知识!

    前面的话   "CSS预处理器"(css preprocessor)的基本思想是,用一种专门的编程语言,进行网页样式设计,然后再编译成正常的CSS文件.SASS是一种CSS的开发工 ...

  5. CSS预处理器Sass、LESS 和 Stylus

    CSS 预处理器技术已经非常的成熟,而且也涌现出了越来越多的 CSS 的预处理器框架.本文向你介绍使用最为普遍的三款 CSS 预处理器框架,分别是 Sass.Less CSS.Stylus. 首先我们 ...

  6. C#预处理器指令 ,你造吗??? (●'◡'●)

    什么是c#预处理指令?? 用于在 C# 源代码中嵌入的编译器命令. C#预处理器指令有哪些?? ↓↓↓这些就是预处理器指令啦 下面我们一一道来(●'◡'●) 1.#if ,#elif,#else,en ...

  7. Myth – 支持变量和数学函数的 CSS 预处理器

    Myth 是一个预处理器,有点类似于 CSS polyfill .Myth 让你写纯粹的 CSS,同时还让你可以使用类似 LESS 和 Sass 的工具.您仍然可以使用变量和数学函数,就像你在其它预处 ...

  8. Harp – 内置常用预处理器的静态 Web 服务器

    Harp 是一个基于 Node.js 平台的静态 Web 服务器,内置流行的预处理器,支持把 Jade, Markdown, EJS, Less, Stylus, Sass, and CoffeeSc ...

  9. Koala – 开源的前端预处理器语言图形编译工具

    koala 是一个前端预处理器语言图形编译工具,支持 Less.Sass.Compass.CoffeeScript,帮助 Web 开发者更高效地使用它们进行开发.跨平台运行,完美兼容 Windows. ...

随机推荐

  1. 合并小图片利器TexturePacker GUI

    合并小图片,能够非常大的节省网络开销.尤其如今的站点非常喜欢使用大量的小图标来做一些友好提示.当然使用图片文字也是一种选择. 只是这里推荐的是TexturePacker GUI ,这个确实是一款利器. ...

  2. 在HDInsight中从Hadoop的兼容BLOB存储查询大数据的分析

    在HDInsight中从Hadoop的兼容BLOB存储查询大数据的分析 低成本的Blob存储是一个强大的.通用的Hadoop兼容Azure存储解决方式无缝集成HDInsight.通过Hadoop分布式 ...

  3. hdu1863

    #include<cstdio> #include<algorithm> using namespace std; int N,M; struct edge { int u,v ...

  4. Codeforces Round #240 (Div. 1) B. Mashmokh and ACM DP

                                                 B. Mashmokh and ACM                                     ...

  5. 【bzoj2464】中山市选[2009]小明的游戏

    直接转换成最短路 #include<algorithm> #include<iostream> #include<cstdlib> #include<cstr ...

  6. mystr = '{}{}{}'.format(mystr, random.randint(0, 9), adurl)

    mystr = '{}{}{}'.format(mystr, random.randint(0, 9), adurl)

  7. go09---defer

    package main /* defer 类似其它语言中的析构函数,在函数体执行结束后 按照调用顺序的相反顺序逐个执行,先进后出, 即使函数发生严重错误也会执行,资源清理文件关闭, 支持匿名函数的调 ...

  8. MPMoviePlayerController属性方法简介

    属性 说明 @property (nonatomic, copy) NSURL *contentURL 播放媒体URL,这个URL可以是本地路径,也可以是网络路径 @property (nonatom ...

  9. edittext 底线颜色

    <style name="Custom.Widget.EditView" parent="Widget.AppCompat.EditText" > ...

  10. android 反编译 for mac

    android反编译现在来说的话很方便. windows上有不好好用的工具,当然我比较喜欢dex2jar 这个是比较好用的,打开他的文件目录会发现,里面有很多.sh .bat文件 那也就是说在wind ...