loop_in_codes

低调做技术__欢迎移步我的独立博客 codemaro.com 微博 kevinlynx

强大的bcb

早就听说bcb(borland c++ builder)是一个强大的RAD开发工具,也早就听说曾经的borland搞出的编译器堪称经典。

恰好最近在做一个GUI工具,想在界面开发上尽量快一点。每一次用上MFC都让我觉得浑身难受,总有些常用的

界面功能它就是没有。在接口实现上,MFC基本上就只是封装了WIN API而已。想想世界上还有什么强大的GUI库,

找了一下,其实不管GUI库封装的怎么样,我更多地还是需要一个工具,能够快速地堆积出界面。

 

于是,在网上下载了被国人精简了的bcb2009。然后,噩梦开始了。首先,我需要把逻辑层代码(也就是实现具体

功能的那一层)移植到BCB下。然后得到了很多和语法相关的编译错误:

 

1.
E2397: Template argument cannot have static or local linkage

这个错误发生于:

void func()
{

    struct Info

    {

        

    };

   std::queue<Info> abc;
}

它的意思是,模板参数必须是全局链接的,总之它不允许std::queue的参数是一个在函数内部临时定义

的类型(谁来告诉我这是C++标准)。

 

2.

E2357 Reference initialized with 'FileLoader::RawData', needs lvalue of type 'FileLoader::RawData'

这个错误发生于:

FileLoader::RawData FileLoader::GetRawData() const;

FileLoader::RawData &raw = loader.GetRawData(); //不能用引用

很久没看C++书,所以,谁又来告诉我C++标准里,这里到底能不能用引用?

 

3.

E2515 Cannot explicitly specialize a member of a generic template class

这个错误发生的情景更复杂些:

template <typename _Tp>

class Test
{

   template <typename _U>

   class Other;

   template <>

   class Other<void>

   {

   };
};

意思是说,我不能在一个模板类里特化成员模板类。谁又来告诉我标准规定的是什么?

 

4.

void func( Obj &a )
{
}

func( Obj() );这个也被视为错误。必须得在调用func之前自己定义个临时变量。

 

5.

我曾经留下了关于宏递归的一些代码,被用在我写的lua-binder和lua-caller中自动生成代码。这下好了,

BCB开始警告我,我的这些宏不能工作了。它和MSVC在某些事情上分歧可真是大:

#define PARAM( n ) ,typename P##n //注意这个宏包含一个逗号

#define CHR( x, y ) CHR1( x, y )

#define CHR1( x, y ) x##y

#define BCB_ERROR( a, b ) CHR( a, b )

BCB_ERROR( 1, PARAM( 1 ) ) 当这样使用宏时,基于我在GNU C上看到的关于宏的规则,会先展开

PARAM(1),于是得到BCB_ERROR( 1, ,typename P2 )。然后,BCB认为PARAM(1)展开的逗号需要参与

BCB_ERROR的展开了。于是,我的整个宏库无法工作了。

关于这个问题,我直接用MSVC写了个生成器,让MSVC替我生成各种参数的lua-binder和lua-caller,然后

写成外部头文件,最后直接在BCB里包含了这些头文件。从而使我的lua-binder和lua-caller可以继续使用。

 

然后,我的1W多行代码终于在BCB下50多个WARNINGS的提示下编译成功了。怀揣着兴奋的心情,想自己终

于可以rapid开发界面了。创建了个VCL FORM APPLICATION,噩梦又开始了:

 

1.

BCB莫名其妙地在我编译一个CPP文件时给出如下提示:

F1004 Internal compiler error at 0x59b4ea8 with base 0x5980000

看起来像是BCB的编译器给崩溃了。囧。google了一下,发现不是我人品问题,很多人遇到相同的问题。

别人给出的解决方案是:restart your bcb。从昨天晚上到现在为止,这个错误发生了好几次。

 

2.

new std::ofstream();会让程序崩溃,往不该写的地方写了东西。我就奇怪了,你BCB自己带的C++IO实现,

难道还有BUG?再次google,还真发现是BCB自己的BUG,并且在几个版本之前就存在这个BUG。那个天真

的老外还说希望在BCB2009下能被修复。修改方案如下:

1)xlocale文件里把这句话注释了:*(size_t *)&table_size = 1 << CHAR_BIT;

2)xlocale里把成员_Id_cnt访问属性改为public,然后在自己的文件里定义一次。

 

3.

程序终于可以运行了。但是BCB的IDE环境总是不那么贴心。我移动了几个窗口改成我习惯的样子,但是一重启

居然又恢复成default(难道是因为盗版)。它的智能提示似乎总是跟着鼠标指针,有时候指向某个符号,鼠标

就显示忙。为了提示某个类的成员,某个函数的原型,BCB偶尔都会卡一下。其实我不介意我的编辑器没有这

些提示功能,在MSVC下我也从不用VA来帮我写代码。我甚至不厌其烦地在VIM下敲代码切窗口去看函数原型,

但是,你他妈作为一个IDE就得像个IDE的样子,要不,你干脆关掉所有功能,别给我卡就行了。

 

这个时候我开始怀疑选择BCB会不会是一个错误的开始,或者说在使用某个东西时,总会带着使用其他同类东西

的感觉甚至偏见去看待这个新事物。但是,在我想坚持继续使用BCB时,我一compile,它又提示我:

F1004 Internal compiler error at 0x59b4ea8 with base 0x5980000

posted on 2009-08-15 11:17 Kevin Lynx 阅读(5743) 评论(17)  编辑 收藏 引用 所属分类: 通用编程

评论

# re: 强大的bcb 2009-08-15 11:27 移动12530彩铃

很好啊~不错  回复  更多评论   

# re: 强大的bcb[未登录] 2009-08-15 12:05 robin

这个bcb用起确实想打人  回复  更多评论   

# re: 强大的bcb 2009-08-15 12:21

"被国人精简了的bcb2009",活该!
为什么不去官方下载完整的原始版本?真佩服你居然有勇气使用国人XX过的版本.  回复  更多评论   

# re: 强大的bcb 2009-08-15 12:22

再补充一下, 无知者无畏啊.
照楼猪你这么说的, CodeGear还做什么开工具, 回家种地去得了. 真是幼稚.  回复  更多评论   

# re: 强大的bcb 2009-08-15 12:50 OwnWaterloo

2和4都是符合标准的, 引用只能绑定到左值, 只有const引用才可以绑定到临时对象。
FileLoader::RawData FileLoader::GetRawData() const;
const FileLoader::RawData& r = loader.GetRawData();
// 估计不是所希望的, 应该这样才对:
const FileLoader::RawData v = loader.GetRawData();


void func( Obj &a )
func( Obj() ); // error in ISO C++

void func(const Obj& a);
func( Obj() ); // ok


1. 我只记函数模板中, 局部类可以使用模板参数。
反过来, 还真不记得了……
连同3, 这种使用了生僻模板技术的代码, 编写的时候就应该注意按标与各编译器的支持程度的差异。  回复  更多评论   

# re: 强大的bcb 2009-08-15 14:02 Kevin Lynx

@OwnWaterloo
3Q
@艹
你就解释下我遇到的那些“BUG”是怎么回事就行了,就事论事。或者你可以告诉我,new std::ofstream在你的BCB上没问题。你的程序编译时不会出现F1004 Internal compiler error。
  回复  更多评论   

# re: 强大的bcb[未登录] 2009-08-15 16:19 欲三更

那些关于模板的标准问题我也不知道,但是那些关于引用的,是符合标准的。现行的标准(非c++09)规定右值只能绑定到const引用上。

编译器崩溃是bcb的bug,并且没有解决方案,我找过很久,根本没有。

关于那个我根本看不懂的宏,更不知道了。。。

总的来说,像你这种情况,我建议你用BCB制作界面,把功能代码全用MSVC搞成dll。  回复  更多评论   

# re: 强大的bcb 2009-08-15 17:56 WindyWinter

用盗版就夹起尾巴来做人。  回复  更多评论   

# re: 强大的bcb 2009-08-15 18:07 小笨象

老实说,我用这么久,除了IDE可能有一些BUG之外,就没一下子遇到这么多问题,可能你用的模板太多了吧。我是用最基本的方式来解决问题的。
模板是不会的。。。。。
第3点,这个是可以在选项中关掉的。BCB中的这个功能,是最被世人所骂的。
但是在2009的时候,已经很好了,可能还是你用的版本的问题吧。总之,不要用所谓的精简版本就没错。
  回复  更多评论   

# re: 强大的bcb[未登录] 2009-08-15 20:49 missdeer

我从大学里开始用BCB,用了六年,之后因为工作需要开始用VC(MFC),之后就再也不想用BCB了。用VC很省事省心,遇到了问题,求助渠道宽广得多,资料也是丰富得多。  回复  更多评论   

# re: 强大的bcb 2009-08-15 22:33 CY

BCB里不敢用那些复杂的模板,即时提示经常好卡,编译出错时就提示那么一句,太难debug了。
不过BCB用来做为C++的界面编程入门还是很好的,比较容易提起学习的兴趣,个人感觉。  回复  更多评论   

# re: 强大的bcb 2009-08-16 00:30 放屁阿狗

bcb我从1.0用到6.0,还是3.0,4.0比较让我满意点,之后就开始混乱了,编译速度很慢,跟delphi无法比,现在又搞出部门独立了,产品越做越糟糕,所以干脆不用了,还是用回vc和wxwidgets
建议使用qt把  回复  更多评论   

# re: 强大的bcb 2009-08-16 13:11 远古毛利人

低调做技术!用惯一种工具自然会不习惯另一种。  回复  更多评论   

# re: 强大的bcb 2009-08-18 22:26 f

我也遇到过在vc下好好的代码拿到bcb下运行会破坏内存 。  回复  更多评论   

# re: 强大的bcb 2009-10-09 14:31 starwing

A local type, a type with no linkage, an unnamed type or a type compounded from any of these types shall not be used as a template-argument for a template type-parameter.

摘自14.3.1.2 ISO C++03
  回复  更多评论   

# re: 强大的bcb 2010-02-27 20:04 杨杨

工具. 我之前也困扰了许久.. 后来结连用了WX. 和QT.. 感觉还不错.   回复  更多评论   

# re: 强大的bcb 2011-07-01 10:41 backup

建议楼主用gcc编译以下你的代码试试,看看什么效果?
  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理