Je ne sais pas comment formuler la question, mais je crée une petite bibliothèque en C et je voulais avoir des #includes facultatifs pour des fonctionnalités supplémentaires. Par exemple, dans library.h:

#ifndef __LIBRARY_H__
#define __LIBRARY_H__

int addNumber(int a, int b);

#ifdef __ADDITIONAL_FEATURE__
//Additional feature if __ADDITIONAL_FEATURE__ is defined
int subtractNumber(int a, int b);

#endif

#endif

Et dans library.c:

#include <stdio.h>
#include "library.h"
int addNumber(int a, int b) {
    return a + b;
}
#ifdef __ADDITIONAL_FEATURE__
int subtractNumber(int a, int b) {
    return a - b;
}
#endif

Et dans un programme de test j'ai fait

#include <stdio.h>
#define __ADDITIONAL_FEATURE__
#include "library.h"

int main(void) {
    printf("%d", subtractNumber(1, 2));
}

Mais quand je le compile, il dit que soustractNumber est un symbole externe non résolu. Mais si je définis ADDITIONAL_FEATURE dans library.c, cela fonctionne. Alors, comment puis-je transmettre la macro ADDITIONAL_FEATURE à library.c? Ou y a-t-il une autre façon de faire cela?

Merci

1
LardPies 31 août 2020 à 21:40

3 réponses

Meilleure réponse

Une solution que je pense est de définir une macro dans la commande de compilation comme celle-ci au lieu de gcc test.c library.c utiliser gcc test.c library.c -D __ADDITIONAL_FEATURE__ et supprimer define de test.c

0
bari barix 31 août 2020 à 19:25

Pour voir votre problème, reconsidérez votre processus de compilation: Vous compilez votre bibliothèque comme ceci:

gcc library.c -o library.o #See, you didn't define __ADDITIONAL_FEATURE__?

Si vous regardez dans les fonctions dans les fichiers objets, vous ne voyez que addNumber, car __ADDITIONAL_FEATURE__ n'a pas été défini ==> La fonction subtractNumber a été supprimée par le préprocesseur.

Ensuite, dans votre programme de test, vous définissez ADDITIONAL_FEATURE , que vous compilez avec

gcc -o executable test.c library.o

Vous référencez subtractNumber, mais ce n'est pas là, car vous n'avez pas compilé votre library.c avec __ADDITIONAL_FEATURE__.

Donc, la liaison échoue.

0
JCWasmx86 31 août 2020 à 18:49

Une autre façon de le faire serait d'implémenter une fonction pour les deux versions. Si la fonction supplémentaire n'est pas demandée, la fonction peut soit ne rien faire, soit renvoyer un code d'erreur ou imprimer un message d'erreur.

0
luser droog 1 sept. 2020 à 02:35