1

我正在使用一个重新定义 NULL 的库。它会导致我程序的其他部分出现一些问题。我不确定我能做些什么。任何想法?我的程序在 C++ 中,库在C中。

#ifdef NULL
#undef NULL
#endif

/**
 * NULL define.
 */
#define NULL    ((void *) 0)

哦,它会产生这些错误:

Generic.h:67: error: default argument for parameter of type 'LCD::LCDBase*' has type 'void*'
Generic.cpp: In constructor 'LCD::Generic::Generic(std::string, Json::Value*, int, LCD::LCDBase*)':
Generic.cpp:44: error: invalid conversion from 'void*' to 'QObject*'
Generic.cpp:44: error:   initializing argument 2 of 'LCD::LCDWrapper::LCDWrapper(LCD::LCDInterface*, QObject*)'
Generic.cpp: In member function 'void LCD::Generic::BuildLayouts()':
Generic.cpp:202: error: invalid conversion from 'void*' to 'LCD::Widget*'
Generic.cpp: In member function 'void LCD::Generic::AddWidget(std::string, unsigned int, unsigned int, std::string)':
Generic.cpp:459: error: invalid conversion from 'void*' to 'LCD::Widget*'
scons: *** [Generic.o] Error 1

这是第一个:

Generic(std::string name, Json::Value *config, int type, LCDBase *lcd = NULL);

编辑:好的,显式转换有效,但我如何转换函数指针?

4

5 回答 5

5

你能在没有这个定义的情况下重建图书馆吗?这就是我首先要尝试的。NULL是一个非常标准的宏,应该假设在任何地方都有定义。

现在,您的问题是 C++ 不允许void *像 C 那样自动转换为其他指针类型。

来自C++ 参考

在 C++ 中,NULL 扩展为 0 或 0L。

如果这不起作用,只需在库中进行全局替换:NULLtoLIBDEFINEDNULL或其他东西。这样,您将保持库代码完整并避免宏冲突。

于 2009-11-30T00:50:29.580 回答
3

您可以访问该库源吗?如果是这样,我认为对他们的代码进行搜索和替换是有必要的。(将它们的 NULL 替换为 LIBNAME_NULL 或类似的东西。)如果这根本不是一个选项,那么我建议在您的代码中使用 0 而不是 NULL。

不过,我很好奇:这会导致什么问题?他们没有改变 null 的值,只是改变了默认的转换。

于 2009-11-30T00:50:55.877 回答
3

最通用的方法是包装有问题的包含并存储恢复宏以前的定义。但是,这取决于编译器。
这是你可以用VC做到的:

#pragma push_macro("NULL")
#include <offendinglib.h>
#pragma pop_macro("NULL")

或者,将宏设置为您之后需要的宏:

#include <offendinglib.h>
#undef NULL
#define NULL 0
于 2009-11-30T00:52:11.497 回答
3

您的一条评论说您考虑过自己重新定义它,但您不知道要重新定义它什么。

许多实现将像这样定义NULL:

#undef NULL

#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void*)0)
#endif

这是因为在 C 中,将其作为 void 指针是有意义的,因为它是一种可以隐式转换为其他类型的指针类型。

C++ 不允许这样做(这会导致您的问题),但使用0而不是NULL工作。

我认为在所有最新版本中,GCC 实际上会将其定义为__null,这是一个不可移植的扩展。

于 2009-11-30T00:59:25.517 回答
-1

是的,您只需要适当地转换:

Generic(std::string name, Json::Value *config, int type,
    LCDBase *lcd = (LCDBase *)NULL);
于 2009-11-30T00:55:21.947 回答