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

Boron

Commander
Dabei seit
Sep. 2001
Beiträge
2.784
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.
 

asdfman

Commander
Dabei seit
März 2008
Beiträge
2.315
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 :/
 

misu

Lieutenant
Dabei seit
Juni 2010
Beiträge
977
Wie wär's mit einem großen Search-And-Replace und das Problem einfach gleich fixen. :)
 
R

rob-

Gast
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 von einem Moderator bearbeitet:

leboh

Ensign
Dabei seit
Mai 2010
Beiträge
167
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:

Hancock

Captain
Dabei seit
Nov. 2007
Beiträge
3.375
Also für den Visual C Compiler gibt's __declspec(deprectated("Text"))
Zitat von stdio.h und crtdefs.h VS 2008:
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.
 

7H3 N4C3R

Lt. Commander
Dabei seit
Feb. 2002
Beiträge
1.816
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:

Boron

Commander
Ersteller dieses Themas
Dabei seit
Sep. 2001
Beiträge
2.784
@ 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.
 
Top