c - 识别和避免宏
问题描述
由于在同名的函数原型中使用宏和宏名称,我有一个遭受命名空间污染的库的组合。具体来说,我正在使用我的 GUI 库 Eagle 和我朋友的网络库 Nilorea。
如何获取代码中包含的所有函数(如宏)的列表?我查看了 MSVS 和 CodeBlocks,但似乎找不到列出它们的方法。我也可以使用
grep
,但这仅对目录或容易获得的文件列表有效。我读到了这个(Macro and function with same name)并发现我可以在声明中(包围)一个函数名以防止宏扩展,但这只能解决我使用与宏同名的函数的实例。MinGW 正在为我无法更改的函数使用宏名称。
我通过分离出像 NOGDI 这样的坏头来避免一些命名空间冲突,
windows.h
并定义 NOGDI 以避免其他一些,但我似乎无法摆脱它们。我知道
#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;
};
解决方案
推荐阅读
- hadoop - 如何从访客操作系统打开 Hue 门户?
- c# - Xamarin.Forms 如何禁用 ListView 上的单击动画
- python - 是否可以从 Flask 提供的页面查看 html/css 中的实时更改?
- javascript - 模拟 window.location 对象
- activerecord - 两个外键与一个主键的关系
- r - R:是否可以使用 quanteda 或任何其他文本挖掘 R 包计算单词突发性?
- c# - Rx.NET“门”操作员
- haskell - 如何在 XMonad 中修改选项卡式窗口的顺序?
- spring - jsonb - 春季搜索
- colors - PhpStorm“垂直线”颜色