首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 宏定义 有什么好? 感觉搞VC的特喜欢用
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-21 12:04:20 楼主
    我总感觉 宏定义带来代码的表达不清晰,很少使用。
    真需要用的时候 也就用const 代替。

    #define WM_SOCKETEX_TRIGGER (WM_USER + 0x101 + 0)
    这样的东西可读性一点也不强,直接用const 不是很好吗?
    原以为 电驴的源代码应该很不错,可惜很多都不行,
    宏定义满天飞,对齐都没做好,注释少的可怜
    类超级大,一个函数几百行 。

    都需要重构

    最近看了一个小日本写的东西也是, 结构化程序设计,到处是宏定义 不过人家逻辑上还是很清晰的,代码也比较规范.
    50  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-21 12:44:521楼 得分:0
    宏定义使结构优化
    把相似结构数据统一定义
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-21 12:47:452楼 得分:0
    mfc出来的时候,c98还没出来

    楼主所说的是代码规范的问题,和代码是否优秀没有必然的关系
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zaodt
    • 等级:
    发表于:2008-06-21 12:55:443楼 得分:0
    引用楼主 wanglovec 的帖子:

    #define WM_SOCKETEX_TRIGGER (WM_USER + 0x101 + 0)
    这样的东西可读性一点也不强,直接用const 不是很好吗?




    也许你是天才,也许你是疯子!


    上边这条定义可读性哪里不好了?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-21 12:56:244楼 得分:0
    class AFX_CLASS_EXPORT CAsyncSocketEx : public CObject
    {
    DECLARE_DYNAMIC(CAsyncSocketEx)

    public:
    CAsyncSocketEx();
    virtual ~CAsyncSocketEx();

    //Creates a socket.
    BOOL Create(UINT nSocketPort = 0, int nSocketType = SOCK_STREAM,
    long lEvent = FD_READ ¦ FD_WRITE ¦ FD_OOB ¦ FD_ACCEPT ¦ FD_CONNECT ¦ FD_CLOSE,
    LPCSTR lpszSocketAddress = NULL, BOOL bReuseAddr = FALSE);


    //Attributes
    //----------

    //Attaches a socket handle to a CAsyncSocketEx object.
    BOOL Attach(SOCKET hSocket, long lEvent = FD_READ ¦ FD_WRITE ¦ FD_OOB ¦ FD_ACCEPT ¦ FD_CONNECT ¦ FD_CLOSE);

    //Detaches a socket handle from a CAsyncSocketEx object.
    SOCKET Detach();

    //Gets the error status for the last operation that failed.
    static int GetLastError();

    //Gets the address of the peer socket to which the socket is connected.
    #ifdef _AFX
    BOOL GetPeerName(CString& rPeerAddress, UINT& rPeerPort);
    #endif
    BOOL GetPeerName(SOCKADDR* lpSockAddr, int* lpSockAddrLen);

    BOOL GetPeerName(UINT32* SocketAddr, UINT16* SocketPort);

    //Gets the local name for a socket.
    #ifdef _AFX
    BOOL GetSockName(CString& rSocketAddress, UINT& rSocketPort);
    #endif


    这是它的部分代码,这还是比较好些的。
    我就搞不明白 它要那些
    #ifdef _AFX

    #endif

    有什么用? 再说看看 C# JAVA  人家都不用这些了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-21 12:59:405楼 得分:0
    引用 3 楼 zaodt 的回复:
    引用楼主 wanglovec 的帖子:

    #define WM_SOCKETEX_TRIGGER (WM_USER + 0x101 + 0)
    这样的东西可读性一点也不强,直接用const 不是很好吗?


    也许你是天才,也许你是疯子!


    上边这条定义可读性哪里不好了?

    恩,那是我的一家之言  不是很喜欢大写的,大写的东西比小写的难看。
    再说 const 取代 #define 的好处 我相信你会不承认吧?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zaodt
    • 等级:
    发表于:2008-06-21 13:02:276楼 得分:0
    这是条件编译,你可以在网上查查。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-21 13:05:477楼 得分:0
    恩,这个我懂,我用C++也两年了。只是不喜欢这样的编程风格,但看到好多代码都这样写。
    我想里面是不是蕴涵着我不知道的东西。

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-21 16:03:298楼 得分:0
    如果考虑C和C++两者的移植性,define是必须的,如果仅仅用于C++ const和内联函数是更优秀的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-28 10:21:119楼 得分:0
    再顶
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-28 10:40:1610楼 得分:0
    宏是由预处理器处理的,通过字符串操作可以完成很多编译器无法实现的功能。比如##连接符。

    如果你仅仅是指#define的话,确实不如用const或enum。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-28 10:49:5711楼 得分:0
    代码规范里面倒是有条,能不用宏定义就不要用,多用const
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-28 15:47:4712楼 得分:0
    以前确实都用宏,现在有逐渐转向const的变化
    例如
    #define A_OK 0
    #define A_FAIL -1
    class A
    {
    };
    现在常用
    class A
    {
    public:
      static const int A_OK = 0;
      static onst int A_FAIL = -1;
    }
    这样确实好看一点,IDE的弹出类菜单也能出现A_OK...
    但是对于有些地方const还是无法取代宏定义的
    例如宏函数定义,还有消息映射等等

    个人感觉宏定义与编码规范并不冲突
    当然滥用是不好的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-30 18:20:4413楼 得分:0
    顶楼的昨不看下.h头文件中还不是一大把的#define吗?照你说法,那微软的工程师们全是"垃圾"了?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-02 09:58:1014楼 得分:0
    顶楼的昨不看下.h头文件中还不是一大把的#define吗?照你说法,那微软的工程师们全是"垃圾"了?
    >> 毕竟时代背景不一样,你现在再看看微软的C#框架 设计的很优雅,面向对象用的很好 很值的学习。
    我们不能因为 他们用了 就说 #define 就一定好,你看看代码大全 上面的评论就知道了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-02 10:04:1815楼 得分:0
    这很正常啊。比如我就习惯用#define来定义消息。不过其他的常量都用const.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lfchen
    • 等级:
    发表于:2008-07-02 10:09:5816楼 得分:0
    与C兼容吧
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-02 10:18:1217楼 得分:0
    有很多功能const不能替换define
    如函数名的替换,空代码等
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-02 10:49:0818楼 得分:0
    我感觉还是先入为主吧,因为绝大多数程序员都是先学C再学C++的,虽然C++说用const好,但是我还是喜欢用define
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-03 18:00:1719楼 得分:0
    晕死,楼主比较高深。。。
    我是从 VB Delphi Java 转到 VC 来的,没觉得什么不爽,
    顶楼的那是一条自定义消息,为了避免和 windows 自身消息冲突,
    Microsoft 建议以 WM_USER 为基址往上增。

    ps:
    比尔大叔退休了,MS 的消息机制还是精华得保留滴。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-03 18:07:4620楼 得分:0
    宏定义是不好看,我也看得头大
    但是没办法,它的优点太多
    1、兼容性好
    2、效率高
    4、实现版本隔离
    5、可以嵌套着玩,让我这种菜鸟觉得特高深

    个人感觉最后那条实在太重要了,不知道微软能不能在不用宏、不改编译器的前提下搞定消息映射
    (说不定把模板、多继承拿出来了)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-03 18:42:3521楼 得分:0
    建议多看看MFC的宏定义,就不会问这种问题了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dyx1024
    • 等级:
    发表于:2008-07-03 19:10:3722楼 得分:0
    存在即合理
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sjdev
    • 等级:
    发表于:2008-07-03 19:23:4523楼 得分:0
    const??
    照你来说写Windows程序就得c++喽?
    要是需要使用c写windows程序,怎么办?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sjdev
    • 等级:
    发表于:2008-07-03 19:24:5924楼 得分:0
    不好意思,c也可以const的哈.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • luohongming
    • 等级:
    发表于:2008-07-03 19:46:3625楼 得分:0
    时间长了你就知道他的好处了.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-03 20:33:1326楼 得分:0
    引用 14 楼 wanglovec 的回复:
    顶楼的昨不看下.h头文件中还不是一大把的#define吗?照你说法,那微软的工程师们全是"垃圾"了?
    >> 毕竟时代背景不一样,你现在再看看微软的C#框架 设计的很优雅,面向对象用的很好 很值的学习。
    我们不能因为 他们用了 就说 #define 就一定好,你看看代码大全 上面的评论就知道了


    那照你说,全世界写编译器的人全是傻B了.无论是window,*nix下的编译程序,#define都是常用的.设计C语言的估计也是傻B一名,因为他们发明了#define.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • langzi8818
    • 等级:
    发表于:2008-07-07 09:55:5627楼 得分:0
    定下!!!!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Crob
    • 等级:
    发表于:2008-07-07 13:11:5628楼 得分:0
    effective c++中建议用static const代替#define宏定义
    我觉得其中一个很令人信服的理由是,#define编译时直接代入值而不会显示名称,而static const会显示名称,这样对程序的debug除错都有好处,另外据说性能也会有提高。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-17 14:06:0229楼 得分:0
    太多的宏定义 这样的带来的很显著的缺点是 代码可读性 不好 看着不清爽 不干净。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-18 20:52:5230楼 得分:0
    一般为了避免头文件的重复定义以及保护变量作用域
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • aguo2005
    • 等级:
    发表于:2008-07-18 21:01:3731楼 得分:0
    习惯了 看什么都顺眼了。呵呵
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved