mikrocontroller.net

Forum: PC-Programmierung Fehler bei #define RADIUS 1.0


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: k-mte (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wenn ich in einem C-Programm folgende Definition vereinbare

#define RADIUS 1.0

erhalte ich mit oder ohne Compileroption -std=c11 folgenden Fehler

expected identifier or »(« before numeric constant

Offensichtlich ist RADIUS bereits als Makro-Funktion definiert.

Wenn ich in /usr/include die Header-Dateien nach dem Stichwort RADIUS 
durchsuche, finde ich aber nichts.

Hier nun meine Fragen:

a) Wo ist die Makro-Funktion RADIUS definiert und was kann man mit ihr 
berechnen?

b) Gibt es eine Möglichkeit für mich, RADIUS doch noch in der von mir 
beabsichtigten Funktion zu definieren?

Vielen Dank für Ihre Antwort!

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kannst du in deiner nicht genannten IDE sämtliche Dateien durchsuchen 
lassen, die zu Projekt gehören?
Dann tue das einfach!

Autor: k-mte (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mein Programm:

#include <stdio.h>
#include <math.h>

#define RADIUS 1.0

#define PI 3.14

int main (int argc, char **argv)
  {
  printf ("%lf\n", 2.0 * (double) RADIUS * (double) PI);

return EXIT_SUCCESS;
  }

Meine IDE: geany.

Mein Verdacht fiel natürlich zuerst auf math.h, die aber das Wort RADIUS 
nicht enthält. Genausowenig wie stdio.h.

Autor: Bauform B. (bauformb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
k-mte schrieb:
> a) Wo ist die Makro-Funktion RADIUS definiert und was kann man mit ihr
> berechnen?

egal.

> b) Gibt es eine Möglichkeit für mich, RADIUS doch noch in der von mir
> beabsichtigten Funktion zu definieren?
static const double RADIUS = 1.0;

Autor: Mark B. (markbrandis)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
k-mte schrieb:
> a) Wo ist die Makro-Funktion RADIUS definiert und was kann man mit ihr
> berechnen?

Jedenfalls nicht in der üblichen C-Standardbibliothek. Woher diese 
Konstanten bei Deiner konkreten Software-Installation stammt, wissen wir 
nicht.

> b) Gibt es eine Möglichkeit für mich, RADIUS doch noch in der von mir
> beabsichtigten Funktion zu definieren?

Ja, mit #undef. Besser wäre natürlich herauszufinden, wo und warum 
RADIUS definiert ist.

Beispiel:
#define RADIUS 1.0

#ifdef RADIUS
#undef RADIUS
#define RADIUS 2.0
#endif

#include <stdio.h>

int main()
{
    printf("RADIUS: %f\n", RADIUS);
    return 0;
}

Autor: Bauform B. (bauformb)
Datum:

Bewertung
-4 lesenswert
nicht lesenswert
Mark B. schrieb:
>> b) Gibt es eine Möglichkeit für mich, RADIUS doch noch in der von mir
>> beabsichtigten Funktion zu definieren?
>
> Ja, mit #undef.

Statt diese Gelegenheit als Beispiel zu nutzen, warum man kein #define 
verwendet, machst du es nur noch schlimmer :(

> Besser wäre natürlich herauszufinden, wo und warum
> RADIUS definiert ist.

Irgendjemand braucht RADIUS und das ging evt. nur als Macro. Schlimm 
genug, da sollten wir uns nicht einmischen. Aber gut, wenn du so 
neugierig bist und dir langweilig ist...

Autor: k-mte (Gast)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Sorry, dummer Fehler von mir...

Das von mir mitgeteilte Programm war natürlich nur ein Auszug aus einem 
größeren Programm, in dem ich in einer Funktion lokal

const double RADIUS = 1.0;

deklariert hatte. Zur dummen Großschreibung an dieser Stelle kam es, 
weil ich testweise die lokalen const double-Deklarationen global 
definieren wollte und zu diesem Zweck mit dem Editor alle 
kleingeschriebenen Variablen durch großgeschriebene ersetzt hatte.

Peinlich...

Autor: Mark B. (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bauform B. schrieb:
> Statt diese Gelegenheit als Beispiel zu nutzen, warum man kein #define
> verwendet

Sagt wer?

Autor: Bauform B. (bauformb)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
Mark B. schrieb:
> Bauform B. schrieb:
>> Statt diese Gelegenheit als Beispiel zu nutzen, warum man kein #define
>> verwendet
>
> Sagt wer?

Jemand (jeder?), der sich diesen völlig unnötigen Fehler ersparen will. 
Vor allem, weil die Fehlersuche nicht immer so einfach ist.

Bei int Konstanten gibt es noch das schwache Argument, dass man damit 
kein Array definieren kann. Bei double ist #define einfach nur nutzlos.

Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Bauform B. schrieb:
> Bei int Konstanten gibt es noch das schwache Argument, dass man damit
> kein Array definieren kann.

Wieso ist das Argument schwach? Was wäre die Alternative?

> Bei double ist #define einfach nur nutzlos.

Nicht immer. Was ist bspw., wenn die erforderliche Größe eines Arrays
ein Ausdruck mit benamsten double-Operanden ist?

Für numerische Konstanten ist eine const-Variable zwar meistens einem
Makro vorzuziehen, aber eben nicht immer.

Übrigens sind auch in der Standardbibliothek numerischen Konstanten
(CHAR_BIT, INT_MAX, HUGE_VAL, INFINITY usw.) als Makro definiert.

Autor: sebastians (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bauform B. schrieb:
>> b) Gibt es eine Möglichkeit für mich, RADIUS doch noch in der von mir
>> beabsichtigten Funktion zu definieren?
> static const double RADIUS = 1.0;

Das geht natürlich nicht, wenn RADIUS schon als Makro definiert ist, 
hilft in diesem Fall also garnichts.

Autor: Bauform B. (bauformb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sebastians schrieb:
> Bauform B. schrieb:
>>> b) Gibt es eine Möglichkeit für mich, RADIUS doch noch in der von mir
>>> beabsichtigten Funktion zu definieren?
>> static const double RADIUS = 1.0;
>
> Das geht natürlich nicht, wenn RADIUS schon als Makro definiert ist,
> hilft in diesem Fall also garnichts.

Wo du Recht hast hast du Recht. Dann kann ich nur hoffen, dass die 
const-Variante die bessere Fehlermeldung erzeugt :(


Yalu X. schrieb:
> Übrigens sind auch in der Standardbibliothek numerischen Konstanten
> (CHAR_BIT, INT_MAX, HUGE_VAL, INFINITY usw.) als Makro definiert.

Naja, früher ging es nicht anders und heute ist es Tradition.

Autor: Mark B. (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bauform B. schrieb:
> Jemand (jeder?), der sich diesen völlig unnötigen Fehler ersparen will.

Die Verwendung eines #define war doch hier aber gar nicht die Ursache 
des Fehlers. Wenn man Bezeichner mit nicht-lokalem Scope doppelt 
verwendet, wird man immer Probleme haben.

Autor: Bauform B. (bauformb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, ich hab's ja eingesehen. Ich kann #define meiden, wie der Teufel das 
Weihwasser, solche Fehler passieren trotzdem. Das heißt, eigene 
Bezeichner müssen mindestens einen Kleinbuchstaben enthalten. Was sagt 
eigentlich Misra dazu? So ein Fehler wird ja u.U. erst sehr spät 
entdeckt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.