2014-07-15 7 views
0

Je souhaite remplacer un appel de fonction par une chaîne à l'aide de directives de pré-processeur. Quelque chose comme ceci:Comment remplacer le nom de fonction par une constante de type chaîne dans la macro #define dans C

#ifdef DEBUG 
    #define Func1(arg) "Function not supported" 
#endif 

Donc, fondamentalement, quand quelqu'un appelle cette fonction, je veux une erreur de compilation, de sorte que cette fonction est invisible en mode DEBUG, et à la place de cela, la chaîne suivante est imprimée dans la compilation bûche. Cette méthode génère une erreur. Existe-t-il un autre moyen d'imprimer une chaîne particulière que je veux lorsque func1() est appelée?

+0

S'il vous plaît préciser « Lancers erreur ». Est-ce une erreur de compilation? Une erreur d'exécution? Fournissez la description de l'erreur et le code sur le site d'utilisation. – Arkadiy

+0

L'erreur exacte est: "Erreur: l'expression doit avoir le type de fonction (pointeur vers)" .... Cette erreur est renvoyée à l'endroit où cette fonction a été appelée. – Shubhi

+0

Le message est-il si important? – zoska

Répondre

2

La méthode la plus évidente pour archiver un tel comportement consiste à utiliser la directive #error. Cependant, comme il n'est pas possible de construire une "directive conditionnelle #error", je suppose que le prochain mouvement est l'opérateur _Pragma introduit dans C99. Voici la solution qui produit un message lors de la compilation:

#include <stdio.h> 

#define DEBUG 1 

#ifdef DEBUG 
    #define Func1(arg) _Pragma("message \"Function not supported.\"") 
#endif 

void (Func1)(int arg) 
{ 
} 

int main(void) 
{ 
    Func1(1); 
    Func1(2); 
    Func1(3); 

    return 0; 
} 

Compilation (avec gcc):

... 
check.c:15: note: #pragma message: Function not supported. 
check.c:16: note: #pragma message: Function not supported. 
check.c:17: note: #pragma message: Function not supported. 

Je sais que ce n'est pas la solution directe (ce message est même pas traité comme un avertissement, donc -Werror doesn ne changez rien), mais vous pouvez utiliser par exemple grep outil ou toute autre méthode pour analyser la sortie du compilateur.

Depuis GCC 4.8 il y a aussi #pragma GCC error "message", qui est une solution directe (mais non portable). Vérifiez this answer pour plus d'informations. Par exemple:

#ifdef DEBUG 
    #define Func1(arg) _Pragma("GCC error \"Function not supported.\"") 
#endif 
+0

Le problème dans mon cas est, j'ai besoin d'une erreur de compilation à l'endroit où la fonction est appelée. Dans votre solution, le préprocesseur sera géré avant que la fonction ne soit compilée. Ainsi, lorsqu'il est géré de manière séquentielle, le préprocesseur ne s'exécute pas. – Shubhi

+0

@ user3840787: L'endroit où la macro de type 'Func1 (arg)' est "exécutée" est l'instruction 'Func1 (1);' dans la définition 'main'. Cela n'a pas d'importance que la macro soit définie, sans invocation correcte, elle ne fait rien. –

0

Vous pouvez utiliser

#error "Function not supported" 

pour abandonner la compilation. Mais, évidemment, quand quelqu'un a accès à la source qui peut être supprimée - alors qu'est-ce que vous essayez de faire exactement?

Si vous ne faites pas confiance à ces personnes avec votre source, ne leur donnez pas. Reliez-le à un .obj, définissez l'interface avec un .h et ne donnez que cela.

+3

J'aurais pu utiliser #error ...:) Mais cela sera appelé immédiatement quand le préprocesseur est manipulé, et NON quand la fonction est appelée. :(:( – Shubhi

1

Une façon consiste simplement à laisser la fonction indéfinie. Cela entraînera une erreur au moment de la liaison.

Si vous utilisez gcc, vous pouvez utiliser l'une de ses extensions, un attribut de fonction:

#ifndef DEBUG 
#define __nodebugonly 
#else 
#define __nodebugonly __attribute__((error("Function not supported"))) 
#endif 

void Func1(int arg) __nodebugonly; 
+0

+1, la première ligne devrait être '#ifndef DEBUG' –

+1

A droite, j'ai mal interprété votre question à ce sujet, puisque' __debugonly 'serait un abus de langage, alors j'ai changé ça aussi. –

Questions connexes