Directives vers librairie

Bonjour à tous.
Je voudrais envoyer, à partir d'un sketch, une directive de pré compilation pour une librairie.
J'ai essayé comme ça: (le .ino)

#define SAVSSD1306
//#include <MCUFRIEND_kbv.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <SavSegNumFast.h>
#include "Fonts/FreeSansBold92.h"
#include "Fonts/FreeCaligraffittiBoldOblique44.h"
#include <Fonts/FreeMono12pt7b.h>


extern uint8_t SmallFont[];
extern uint8_t BigFont[];
//extern uint8_t SevenSegNumFont2[];

#define LCD_CS    A3 // Chip Select goes to Analog 3
#define LCD_RS    A2 // Command/Data goes to Analog 2
#define LCD_WR    A1 // LCD Write goes to Analog 1

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
#define OLED_RESET     4 // Reset pin # (or -1 if sharing Arduino reset pin)

Adafruit_SSD1306 tft (SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


//MCUFRIEND_kbv tft;
SavSegNumFast ssn;

Donc je défini #define SAVSSD1306
le .h

#ifndef SavSegNumFast_h
#define SavSegNumFast_h
   
#include <Arduino.h>
#include <MCUFRIEND_kbv.h>
#include "Adafruit_SSD1306.h"

class SavSegNumFast
{
public:
SavSegNumFast();
void setDim(uint16_t l=10, uint16_t h=17, uint16_t hs=3, uint16_t inr=12);// l=segment length; h=segment heigth; hs= segment thickness, inr=Whitespace character
void setColors(uint16_t color, uint16_t bColor);//color=segment color; bColor= back color
void printSegNumNoTime(uint16_t posX, uint16_t posY, char charToPrint[]);
void printSegNum(uint16_t posX, uint16_t posY, char charToPrint[]);
uint32_t printSegNumTime(uint16_t posX, uint16_t posY, char charToPrint[]);
#ifdef SAVSSD1306
void init(Adafruit_SSD1306& tft);
#else
void init(MCUFRIEND_kbv& tft);
#endif
private:
.............
#ifdef SAVSSD1306
Adafruit_SSD1306 _tft;
#else
MCUFRIEND_kbv _tft;
#endif
};
    
#endif

le .cpp

#include <Arduino.h>
#include "SavSegNumFast.h"

SavSegNumFast::SavSegNumFast()
{
}

#ifdef SAVSSD1306
void SavSegNumFast::init(Adafruit_SSD1306& tft)
{
  _tft = tft;
}
#else
void SavSegNumFast::init(MCUFRIEND_kbv& tft)
{
  _tft = tft;
}
#endif
...................

Ceci dans le but de pouvoir utiliser une libraire (MCUFRIEND_kbv) ou l'autre (Adafruit_SSD1306) à partir du sketch sans devoir modifier la librairie.
On dirait que le .cpp reçoit la directive mais pas le .h.
Comme je dois faire?

Impossible.
SAVSSD1306 est évalué d'une part en compilant le .cpp, et dans ce cas il n'est pas défini, et d'autre part en compilant le .ino, où là il est bien défini.

Est ce que il y a un autre façon, ou la seule façon est de modifier la librairie (mettre le #define dans .h et .cpp) ?

Ce que tu essaies de faire est, je suppose, d'avoir une interface standardisée en évitant d'inclure le code de deux librairies MCUFRIEND_kbv et SSD1306.

Premièrement, la librairie AdaFruit SSD1306 n'est pas la plus économe : https://riton-duino.blogspot.com/2019/11/afficheur-oled-ssd1306-comparons

Ce n'est certainement pas celle que je choisirais.

Deuxièmement, espérer obtenir une interface exploitable pour des écrans aussi différents, ne serait-ce qu'en taille, me semble peine perdue pour pas grand chose.

Ce que tu essaies de faire est, je suppose, d'avoir une interface standardisée en évitant d'inclure le code de deux librairies MCUFRIEND_kbv et SSD1306.

Mon but est de pouvoir utiliser pas seulement ce deux librairie mais plusieurs, même la librairie Greiman,
Pour commencer j'ai utilisé ces deux parce que la première je la connais très bien et la deuxième parce que se reposesur la même librairie (Adafruit_GFX) donc essayer 2 librairie sans modifier mes fonctions.
Avant de continuer sur ce tracé, je dois savoir si c'est possible de transmettre une directive au pre compilateur à une librairie à travers le sketch.
Si ce n'est pas possible il me reste que de modifier la directive dans ma librairie ou de créer une librairie pour chaque librairie d’écran que j'ai décidé de pouvoir utiliser.

Cette information peux aussi me servir dans le futur.

Deuxièmement, espérer obtenir une interface exploitable pour des écrans aussi différents, ne serait-ce qu'en taille, me semble peine perdue pour pas grand chose.

Pour ce que je suis en train de faire, ce n'est pas peine perdue. C'est justement la différence de taille qui m'as poussé à choisir le SSD1306.

Avant de continuer sur ce tracé, je dois savoir si c'est possible de transmettre une directive au pre compilateur à une librairie à travers le sketch.

Non, cela ne peut se faire qu'à l'aide de variables ou de fonctions.

Les deux classes MCUFRIEND_kbv Adafruit_SSD1306 héritent de Adafruit_GFX qui elle-même hérite de la classe Print, donc le polymorphisme est assuré, en grande partie.

Donc pour le peu qui reste, constructeur, begin(), etc. fais ça tout simplement dans ton application.
Il est tout de même rare de compiler la même application pour qu'elle marche sur deux écrans de tailles vraiment différentes.

Ta classe SavSegNumFast devra de plus implémenter toutes les méthodes de la classe Adafruit_GFX et de la classe Print.
Beaucoup de travail, et une consommation mémoire excessive au final.

Non, cela ne peut se faire qu'à l'aide de variables ou de fonctions.

OK, C'est ce que je volais savoir.
Merci beaucoup hbachetti.