C Compiler/Präprozessor-Warnung erzeugen bei Benutzung eines #defines

Boron

Commander
Registriert
Sep. 2001
Beiträge
2.785
Hallo zusammen,

ich habe da eine echt harte Nuss zu knacken. Meine sehr fundierten C-Kenntnisse reichen nicht aus, darum richtet sich diese Frage an echte C-Profis.

Ich habe einer Headerdatei ein define:
PHP:
#define GET_SYSTEM_TIME theSysTimeVariable
Das #define wird an vielen Stellen im Quellcode des Projekts genutzt.
Da dieses #define als Schnittstelle hässlich ist und auch Probleme verursacht, möchte ich eine C-Funktion als neue Schnittstelle einführen, das #define aus Kompatibiltätsgründen aber noch zulassen:
PHP:
extern int GetSystemTime(void); 
#define GET_SYSTEM_TIME GetSystemTime()
Jetzt würde ich gerne erreichen, dass jeder, der das "alte" #define nutzt einen Warnung durch den Präprozessor/Compiler angezeigt bekommt, dass das #define veraltet sei und im Code die C-Funktion direkt genutzt werden soll.
Der Compiler soll aber weiterlaufen und wie gehabt die ausführbare Datei erstellen.
Ich dachte an so etwas:
PHP:
extern int GetSystemTime(void); 
#define GET_SYSTEM_TIME \
      #warning "Define is deprecated. Use function instead" \
      GetSystemTime()
Allerdings akzeptiert der Compiler, wie befürchtet, eine solche Konstruktion nicht :(.

Ich hoffe das klar ist was ich erreichen will.
Vielleicht gibt es eine gänzlich andere Idee das zu erreichen.
 
Meine spontane erste Idee: Du könntest das Makro so definieren, dass seine Benutzung einen Syntaxfehler erzeugt.
Das hat natürlich den Nachteil, dass der Benutzer erstmal nicht weiß, was sein Fehler ist :/
 
Wie wär's mit einem großen Search-And-Replace und das Problem einfach gleich fixen. :)
 
Bin zwar kein C Profi, aber ich wage es mal.

Code:
extern unsigned int counter;
#define free(m)((counter++,free(m)))

Damit kann man sich dranhängen/umleiten und Zugriffe auf free() / malloc usw. zählen.
Bischen umbauen dann sollte doch gehen.

Jeder Zugriff auf die Datumsfunktion müsste dann das Zeug in der Klammer mit ausgeben
 
Zuletzt bearbeitet von einem Moderator:
Geht nicht, ein Makro kann nichts erzeugen was als Praeprozessor Direktive interpretiert wird,
der Praeprozessor ist Single Pass:

C99 Standard (6.10.3.4 paragraph 3):

3 The resulting completely macro-replaced preprocessing token sequence is not processed as a preprocessing directive even if it resembles one, ...
Ergänzung ()

Zu
was spricht gegen
#ifdef GET_SYSTEM_TIME
#warning blabla
#endif


Die Tatsache dass ER GET_SYSTEM_TIME immer definieren will, und nur dem der es nutzt eine Warnung geben will?

Also nicht
#ifdef
sondern
#ifused
was es eben nicht gibt.
 
Zuletzt bearbeitet:
Also für den Visual C Compiler gibt's __declspec(deprectated("Text"))
stdio.h und crtdefs.h VS 2008 schrieb:
Code:
#if _MSC_FULL_VER >= 140050320
#define _CRT_DEPRECATE_TEXT(_Text) __declspec(deprecated(_Text))
#else
#define _CRT_DEPRECATE_TEXT(_Text) __declspec(deprecated)
#endif

/* Define _CRT_INSECURE_DEPRECATE */
/* See note on use of deprecate at the top of this file */
#if defined(_CRT_SECURE_NO_DEPRECATE) && !defined(_CRT_SECURE_NO_WARNINGS)
#define _CRT_SECURE_NO_WARNINGS
#endif

#ifndef _CRT_INSECURE_DEPRECATE
#ifdef _CRT_SECURE_NO_WARNINGS
#define _CRT_INSECURE_DEPRECATE(_Replacement)
#else
#define _CRT_INSECURE_DEPRECATE(_Replacement) _CRT_DEPRECATE_TEXT("This function or variable may be unsafe. Consider using " #_Replacement " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")
#endif
#endif
_Check_return_ _CRT_INSECURE_DEPRECATE(sscanf_s) _CRTIMP int __cdecl sscanf(_In_z_ const char * _Src, _In_z_ _Scanf_format_string_ const char * _Format, ...);
Wenn du dann diese Funktion nutzt, kommt eine Fehlermeldung "warning C4996: 'sscanf': This function or variable may be unsafe. Consider using sscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."

Ob's das für den GCC auch gibt, weiß ich nicht.
 
Code:
extern int GetSystemTime(void);
extern int GetSystemTimeDeprecated() __attribute__((deprecated));
#define GET_SYSTEM_TIME GetSystemTimeDeprecated()

GetSystemTimeDeprecated ruft dann einfach nur GetSystemTime auf.

Ich glaub du musst mindestens mit -Wall kompilieren.

HTH

(setzt natürlich einen gcc oder etwas kompatibles voraus)

Edit: Die erste Konstruktion sollte deshalb nicht funktionieren, weil der Präprozessor das in eine einzige Zeile klöpperln dürfte und der Call damit verschwindet. Hast du mal probiert, die Reihenfolge zu vertauschen? Nur als Idee, nicht ausprobiert.
 
Zuletzt bearbeitet:
@ 7H3 N4C3R
Das ist es :). Beim lesen deines Posts hatte ich schon befürchtet, dass mein Compiler die Attribute nicht kennt (GreenHills Compiler für NEC V850 Microcontroller).
Aber *freude, freude* der Compilerhersteller hat das vom GCC übernommen.
 
Zurück
Oben