2017-11-29 2 views
1

Ich habe zwei Dateien (average.h, average.c). In der Definition einer Struktur habe ich #ifdef INTERNAL verwendet.Kompilieren von C-Code nicht möglich, wenn das Makro #define für Strukturelement in Header-Datei

#ifndef AVERAGE_H_ 
#define AVERAGE_H_ 


typedef struct str_internal { 
    int i1; 
    int i2; 
} internal; 

typedef struct str_speed { 
    int lowest; 
    int highest; 
#ifdef INTERNAL 
    internal i; 
#endif 
} speed; 


extern double average(speed twoStroke); 

#endif /* AVERAGE_H_ */ 

Der Inhalt average.c sind,

#include <stdio.h> 
#include "average.h" 

double average(speed twoStroke) { 
    double average = (twoStroke.highest + twoStroke.lowest)/2.0; 

#ifdef INTERNAL 
    average += twoStroke.internal.i1+twoStroke.internal.i2; 
#endif 

    return average; 
} 


int main() { 
    speed twoStrokeEngine; 
    twoStrokeEngine.highest = 70; 
    twoStrokeEngine.lowest = 50; 
#ifdef INTERNAL 
    twoStrokeEngine.internal.i1=20; 
    twoStrokeEngine.internal.i2=10; 
#endif 
    double avg = average(twoStrokeEngine); 
    printf("Average speed of two stroke engine is: %f", avg); 
    return 0; 
} 

Wenn ich versuche, diesen Code zu kompilieren, gcc -DINTERNAL -o average.exe average.c Ich erhalte die folgende Fehlermeldungen.

average.c:8:22: error: ‘speed {aka struct str_speed}’ has no member named ‘internal’ 
    average += twoStroke.internal.i1+twoStroke.internal.i2; 
        ^
average.c:8:44: error: ‘speed {aka struct str_speed}’ has no member named ‘internal’ 
    average += twoStroke.internal.i1+twoStroke.internal.i2; 
              ^
average.c: In function ‘main’: 
average.c:20:17: error: ‘speed {aka struct str_speed}’ has no member named ‘internal’ 
    twoStrokeEngine.internal.i1=20; 
       ^
average.c:21:17: error: ‘speed {aka struct str_speed}’ has no member named ‘internal’ 
    twoStrokeEngine.internal.i2=10; 

Antwort

11

Das Problem ist mit

twoStroke.internal.i1+twoStroke.internal.i2; 
      ^^^     ^^^^ 

internal ein Typ ist, nicht ein Element, das Sie zugreifen können. Sie müssen auf die Mitgliedsvariablen zugreifen. Die Membervariable, die vom Typ ist internal ist i, so dass Ihre Aussagen so etwas wie

twoStroke.i.i1+twoStroke.i.i2; 
+3

@ Bathsheba, aber darüber hinaus, das Privileg, dem 100K-Club mit Mentoren wie dir beizutreten, ist ehrlicher, es gibt keine zwei Dinge. :) –

+0

Ja, aber das musst du Leffler fangen .... –

7

Typo:

twoStrokeEngine.internal.i1=20; 

sollte

twoStrokeEngine.i.i1=20; 

und so weiter sein. i ist das Mitglied, nichtinternal. Letzteres ist die typedef für die struct.

+2

@ Ringo aussehen sollte: Lassen Sie uns das dazu hinstellen: https://en.wikipedia.org/wiki/Relativity_of_simultaneity – Bathsheba

Verwandte Themen