在头文件中使用宏#define作为struct成员时,无法编译c代码

Nan*_*dha 1 c structure member-access

我有两个文件(average.h,average.c).在我使用的结构的定义中#ifdef INTERNAL.

#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_ */
Run Code Online (Sandbox Code Playgroud)

average.c的内容是,

#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;
}
Run Code Online (Sandbox Code Playgroud)

当我尝试编译此代码时, gcc -DINTERNAL -o average.exe average.c 我收到以下错误消息.

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;
Run Code Online (Sandbox Code Playgroud)

Sou*_*osh 11

问题在于

  twoStroke.internal.i1+twoStroke.internal.i2;
            ^^^                   ^^^^
Run Code Online (Sandbox Code Playgroud)

internal是一种类型,而不是您可以访问的成员.您需要访问成员变量.成员变量,类型internali,所以你的语句应该是这样的

 twoStroke.i.i1+twoStroke.i.i2;
Run Code Online (Sandbox Code Playgroud)

  • @Bathsheba,而且,与你这样的导师一起加入100K俱乐部的特权是更加光荣的,没有两件事情可言.:) (3认同)

Bat*_*eba 7

错字:

twoStrokeEngine.internal.i1=20;
Run Code Online (Sandbox Code Playgroud)

必定是

twoStrokeEngine.i.i1=20;
Run Code Online (Sandbox Code Playgroud)

等等.i是会员,不是 internal.后者是typedef为了struct.

  • @RingØ:让我们把它归结为:https://en.wikipedia.org/wiki/Relativity_of_simultaneity (2认同)