首页 > 解决方案 > 识别和避免宏

问题描述

由于在同名的函数原型中使用宏和宏名称,我有一个遭受命名空间污染的库的组合。具体来说,我正在使用我的 GUI 库 Eagle 和我朋友的网络库 Nilorea。

  1. 如何获取代码中包含的所有函数(如宏)的列表?我查看了 MSVS 和 CodeBlocks,但似乎找不到列出它们的方法。我也可以使用grep,但这仅对目录或容易获得的文件列表有效。

    我读到了这个(Macro and function with same name)并发现我可以在声明中(包围)一个函数名以防止宏扩展,但这只能解决我使用与宏同名的函数的实例。MinGW 正在为我无法更改的函数使用宏名称。

    我通过分离出像 NOGDI 这样的坏头来避免一些命名空间冲突,windows.h并定义 NOGDI 以避免其他一些,但我似乎无法摆脱它们。

  2. 我知道#undef如果需要我可以使用符号,并且我在这方面的成功有限,以及更改标题的包含顺序,但我仍然遇到问题。

那么我有什么选项可以清理这些令人讨厌的宏的代码呢?

我查看了 CPP(C 预处理器)程序的帮助,它没有显示任何在给定标头中列出宏的能力。

我需要编写自己的自定义解决方案吗?铿锵呢?

有关 Nilorea 和 MinGW-W64 之间碰撞的示例,请参见此处:

这是 Nilorea 中与 mingw 冲突的宏:

/*! Free Handler to get errors */
#define Free( ptr ) \
    if (  ptr  )\
    {\
        free(  ptr  );\
        ptr  = NULL;\
    }\
    else\
    {\
        n_log( LOG_DEBUG , "Free( %s ) already done or NULL at line %d of %s \n", #ptr , __LINE__ , __FILE__ );\
    }

它生成的编译器错误具有误导性,但在这些函数原型中指向 c:\mingw\i686-w64-mingw32\include\objidbase.h 和 oaidl.h:

#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("00000002-0000-0000-c000-000000000046")
IMalloc : public IUnknown
{
    virtual void * STDMETHODCALLTYPE Alloc(
        SIZE_T cb) = 0;

    virtual void * STDMETHODCALLTYPE Realloc(
        void *pv,
        SIZE_T cb) = 0;

    virtual void STDMETHODCALLTYPE Free(
        void *pv) = 0;

    virtual SIZE_T STDMETHODCALLTYPE GetSize(
        void *pv) = 0;

    virtual int STDMETHODCALLTYPE DidAlloc(
        void *pv) = 0;

    virtual void STDMETHODCALLTYPE HeapMinimize(
        ) = 0;

};

标签: cmacros

解决方案


推荐阅读