首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

问两个关于C++宏的有关问题

2012-04-05 
问两个关于C++宏的问题1.各种C++教材都这样教导我们:用inline函数代替宏函数,用const变量代替宏变量,并细

问两个关于C++宏的问题
1.各种C++教材都这样教导我们:用inline函数代替宏函数,用const变量代替宏变量,并细数N多好处。可是我在诸多十分正式的库里都发现,宏函数和宏变量还是大大地有。为什么这些库都不按照教材去做呢?是教材忽悠人?还是写库的人太二了?

2.关于编译器和库的宏:在移植性比较好的C++库里,经常会发现很多用于选择编译器和库的宏,以下是若干例子:
1)侯捷《STL源码剖析》中有如下的宏:
#ifdef (__BORLANDC__)
//do something
#endif
2)某牛人写的某库里也有:
#ifdef __MACRO_C_YOUNG_LIBRARY_COMPILER_SUPPORT_STANDARD_MEMORY_FUNCTION__
//do something
#endif

可以看出,通过这些宏可以判断哪个编译器,甚至可以判断编译器是否支持某些函数。
问题是:我怎么知道该用什么样的宏来判断。
比如我怎么知道可以用(__BORLANDC__)判断是不是Borland的编译器?那某日我希望支持某个其它编译器的时候,我怎么知道用什么样的宏来判断呢?
从第二个例子看起来,宏的名字似乎是作者任意指定的。那么,这个宏是哪里定义的呢?换句话说,我怎么能得到当前编译器是否支持某函数的信息呢?是不是编译时输入的?还是说,当我们编译的时候,要另写一个文件,这个文件包括各种可能用到的编译器支持情况?

[解决办法]
写库和用库函数写应用程序不同。
[解决办法]
1.宏定义比较直观,简洁,易懂,用起来也方便,而且大家都已经习惯用宏了。。。还有就是一些如条件编译等只能用宏来做。
2.(__BORLANDC__)像这种的应该是编译器或者操作系统里包含有该信息,如_WIN32。如果不是的话,那么应在使用处#define 该宏,如果使用到的宏定义很多的话,可以在外面另写一个def.h文件,将各种可能的#define 包含进去。

个人见解。。。
[解决办法]
宏是杀手,^_^..
比如:#define private public
[解决办法]
一把刀子,你可以用它来切水果,也可以用它来杀人。就看你是哪个等级上的人了。如果自认没有杀人的本领,那还是用它来切水果吧,否则会自伤!
[解决办法]
哎,遇到这种问题,只能无语了.
不是教材忽悠人,也不是写库的人太二了
是你自己太直拙了
[解决办法]
楼主和我性格比较象
大多数时候,别人看来比较“较真”,认为没必要解释这些。
不过,我是非常支持你的。
本人水平低,尝试着回答你的问题:
问题1:
的确,现在宏是千夫所指,非难无数。但是,宏就没有好处了吗?肯定有一些。
当然,我觉得现在使用宏最主要的原因是可移植性好,目的是和已经存在的系统尽量匹配。
比如,很多都是C/C++公用的。这方面最典型的例子就是C99使用_BOOL而不用bool类型,是因为C89中本没有bool,
但很多编译器都自己实现了bool。为了兼容性,C99名字定位_BOOL,这一点上C99和C++是不兼容的。

问题2:
对特定的编译器,宏的命名和作用是固定的。并且(我初步认为)标准很有可能规定了一些通用的用于编译选项的宏。比如_cplusplus判断是C还是C++。这个好像是统一的。因为The C++ Programming Language中讲到这个的时候并没有提起具体编译器。

本人水平低,以上只是个人一些粗浅的看法。

热点排行