web-dev-qa-db-fra.com

Comment générer une erreur ou un avertissement dans le préprocesseur C?

J'ai un programme qui ne doit être compilé qu'en mode DEBUG. (objectif de test)

Comment puis-je empêcher le préprocesseur d'empêcher la compilation en mode RELEASE?

52
Eonil

Placez n'importe où:

#ifndef DEBUG
#error Only Debug builds are supported
#endif
75
Hans Passant

C fournir un #error, et la plupart des compilateurs ajoutent un #warning déclaration. La documentation de gcc recommande pour citer le message.

19
philant

Peut-être quelque chose de plus sophistiqué, mais ce n'est que du copier-coller des solutions précédentes. :-)

#ifdef DEBUG        
    #pragma message ( "Debug configuration - OK" )
#Elif RELEASE   
    #error "Release configuration - WRONG"
#else
    #error "Unknown configuration - DEFINITELY WRONG"
#endif

P.S. Il existe également une autre façon de générer un avertissement. Créez une étiquette non référencée comme

HereIsMyWarning:

et ne vous y référez pas. Pendant la compilation, vous obtiendrez un avertissement comme

 1>..\Example.c(71) : warning C4102: 'HereIsMyWarning' : unreferenced label
11
Zdeno Pavlik

Vous pouvez utiliser une directive error pour cela. Le code suivant générera une erreur au moment de la compilation si DEBUG n'est pas défini:

#ifndef DEBUG
#error This is an error message
#endif
4
Laurent Etiemble

Si vous souhaitez simplement signaler une erreur:

#ifdef RELEASE
  #error Release mode not allowed
#endif

fonctionnera avec la plupart des compilateurs.

3
anon

Pour GCC et Clang (et probablement tout compilateur qui prend en charge la fonction _Pragma), vous pouvez définir une macro:

#if ! DEBUG
#define FIX_FOR_RELEASE(statement) _Pragma ("GCC error \"Must be fixed for release version\"")
#else
#define FIX_FOR_RELEASE(statement) statement
#endif

Vous pouvez utiliser cette macro pour des hacks temporaires, par exemple pour contourner le code qu'un collègue n'a pas encore écrit, pour vous assurer de ne pas oublier de le corriger une fois que vous souhaitez publier une build au public. Soit

FIX_FOR_RELEASE()
// Code that must be removed or fixed before you can release

ou

FIX_FOR_RELEASE(statement that must be removed or fixed before you can release);
1
gnasher729

Dans Code :: Blocks, si vous ne voulez pas le mode Release, vous pouvez supprimer le mode Release. Pour ce faire, cliquez sur le menu Projet, sélectionnez Propriétés ... et dans l'onglet Créer des cibles, vous pouvez cliquer sur Libérer, puis sur le bouton Supprimer. La suppression du mode Release ne le fait que pour le projet en cours, vous pouvez donc toujours l'utiliser dans d'autres projets.

Sinon, si vous voulez vraiment utiliser le préprocesseur, vous pouvez le faire:

#ifdef RELEASE
#error "You have to use the Debug mode"
#endif
1
Donald Duck