库重新定义了NULL

Sco*_*ott 1 c c++ null undefined c-preprocessor

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

#ifdef NULL
#undef NULL
#endif

/**
 * NULL define.
 */
#define NULL    ((void *) 0)
Run Code Online (Sandbox Code Playgroud)

哦,它会产生这些错误:

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
Run Code Online (Sandbox Code Playgroud)

这是第一个:

Generic(std::string name, Json::Value *config, int type, LCDBase *lcd = NULL);
Run Code Online (Sandbox Code Playgroud)

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

Gyö*_*sek 5

你可以在没有那个定义的情况下重建库吗?这就是我先尝试的.NULL是一个非常标准的宏,应该假定在任何地方定义.

现在,你的问题是C++不允许自动转换void *为其他指针类型,如C.

来自C++参考:

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

如果这不起作用,只需在库中执行全局替换:NULLto LIBDEFINEDNULL或something.这样你就可以保持库代码的完整性并避免宏冲突.

  • 我在lib的IRC频道上与某人聊天.他不确定为什么重新定义了NULL.我继续前进,刚从库中删除它,它编译得很好. (4认同)