二级C宏,第1张

二级C宏,第2张

水平不高也不低的C++程序员最喜欢说的一句话是:C宏,万恶之首,错误的开始,应该抛弃。

请注意,我用了一个不敬的修饰语“不算高也不算低”。为什么这么说?因为水平低,我一句话都插不进去。我都在静静地听老前辈们说教。高层次的人,比如Bane Stroustrup,也只是说C++语言在几个场合能提供比C宏更好的解决方案,并没有完全否定C宏的价值。但又怕传来传去,走样。久而久之,就传到了上面这句话。其实挺搞笑的:java程序员常说java比C++好,C++手动释放内存,老是搞内存泄漏;C++程序员反驳说,你太低级了,用不上。但说到C宏,水平不高也不低的C++程序员其实还是走java的老路——明明不会用,也知之甚少,却把责任推卸到C宏身上。我可以不管你傻不傻,但是你的错误言论误导后人就不好了。

下面是一些使用C宏的简单例子。如果这些例子用C++语法不用宏就能更好的解决,那你一定要回复告诉我,这样我下次就不废话了。不然晓晓很生气,后果会很严重。:)

首先,用C宏更简洁地写代码。这个代码是所有写网络程序的朋友都熟悉的。它是mbuf在Net/3中的实现。

struct mbuf
{
struct m _ HDR mhdr;
union {
struct
{
struct PKT HDR MH _ PKT HDR;/* M _ PKTHDR set */
union
{
struct M _ ext MH _ ext;/* M _ EXT set */
char MH _ databuf[MH len];
} MH _ dat;
} MH;
char M _ databuf[MLEN];/* !M_PKTHER,!M _ EXT */
} M _ dat;
};

上面的代码,如果我想访问最里面的MH_databuf,那么我要写M_dat。MH.MH_dat。MH _ databuf是不是太长太难写了?这段代码读起来也不清楚。其实对于MH_pkthdr,MH_ext,MH_databuf来说,虽然不在一个结构层次上,但是如果从mbuf的外部来看,都是mbuf的属性,完全可以展平成一个平面。所以,源代码中有这样一组宏:

# define m _ next m _ HDR . MH _ next
# define m _ len m _ HDR . MH _ len
# define m _ data m _ HDR . MH _ data
......
#定义m_pkthdr M_dat。MH . MH _ PK thdr
# define M _ pktdat M _ dat。MH.MH_dat。MH_databuf
......

这样写代码不是很简洁吗?

第二,用C宏实现跨平台和编译器的需求。这个例子太好了。随便从VC库的源代码里抄一段就行了。

# ifndef _ crtapi 1
# if _ MSC _ VER > = 800 & & _ M IX86 > = 300
# define _ crtapi 1 _ _ cdecl
# else/* _ MSC _ VER > = 800 & & _ M IX86 > = 300 */
# define _ crtapi 1
# endif/* _ MSC _ VER > = 800 & & _ M IX86 > = 300 *

# ifndef _ SIZE _ T _ DEFINED
typedef unsigned int SIZE _ T;
# define _ SIZE _ T _ DEFINED
# endif/* _ SIZE _ T _ DEFINED */

# ifndef _ MAC
# ifndef _ WCHAR _ T _ DEFINED
typedef无符号短WCHAR _ T;
# define _ WCHAR _ T _ DEFINED
# endif/* _ WCHAR _ T _ DEFINED */
# endif/* _ MAC */

# ifndef _ nls CMP _ DEFINED
# define _ nls CMP error 2147483647/* currently = = INT _ MAX */
# define _ nls CMP _ DEFINED
# endif/* _ nls CMP _ DEFINED */

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 二级C宏

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情