Question

Je travaille avec une bibliothèque qui redéfinit NULL. Cela cause des problèmes avec d'autres parties de mon programme. Je ne suis pas sûr de ce que je peux faire à ce sujet. Une idée? Mon programme est en C ++, la bibliothèque en C .

#ifdef NULL
#undef NULL
#endif

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

Oh, et cela produit ces erreurs:

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

Voici le premier:

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

Éditer: Ok, le casting fonctionne explicitement, mais comment puis-je utiliser un pointeur de fonction?

Était-ce utile?

La solution

Pouvez-vous reconstruire la bibliothèque sans cette définition? C'est ce que j'essayerais en premier. NULL est une jolie macro standard, qui doit être supposée être définie partout.

Pour le moment, votre problème est que le C ++ n'autorise pas les transferts automatiques de void * vers d'autres types de pointeurs, comme le fait le C.

De la Référence C ++ :

  

En C ++, NULL passe à 0 ou à 0 L.

Si cela ne fonctionne pas, effectuez un remplacement global dans la bibliothèque: NULL en LIBDEFINEDNULL ou quelque chose du genre. Ainsi, vous garderez le code de la bibliothèque intact et éviterez la collision de macros.

Autres conseils

Avez-vous accès à cette source de bibliothèques? Si c'est le cas, je pense qu'une recherche et un remplacement sur leur code sont en ordre. (Remplacez leur valeur NULL par LIBNAME_NULL ou un nom similaire.) Si ce n'est tout simplement pas une option, je vous recommande d'utiliser 0 dans votre code au lieu de NULL.

Je suis cependant curieux: quels problèmes cela cause-t-il? Ils ne modifient pas la valeur null, mais uniquement la diffusion par défaut.

Un de vos commentaires indique que vous avez envisagé de le redéfinir vous-même, mais que vous ne savez pas en quoi le redéfinir.

De nombreuses implémentations définiront NULL comme ceci:

#undef NULL

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

En effet, en C, il est logique de l'avoir comme pointeur vide, car c'est un type de pointeur qui peut être implicitement converti en d'autres types.

C ++ ne le permet pas (ce qui pose problème), mais utiliser 0 au lieu de NULL fonctionne.

Je pense que dans toutes les versions récentes, GCC le définira comme suit: __ null , qui est une extension non portable.

L’approche la plus générique consisterait à résumer les inclusions incriminées et stocker et restaurer la définition précédente des macros. Ceci, cependant, dépend du compilateur.
Voici comment vous pouvez le faire avec VC:

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

Sinon, définissez la macro sur ce dont vous avez besoin par la suite:

#include <offendinglib.h>
#undef NULL
#define NULL 0

Oui, il vous suffit de lancer le casting de manière appropriée:

Generic(std::string name, Json::Value *config, int type,
    LCDBase *lcd = (LCDBase *)NULL);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top