2

opts.h:

#ifndef PINF_OPTS_H
#define PINF_OPTS_H
#endif //PINF_OPTS_H

// == DEFINE ==
#define MAX_OPTS 100

// == VAR ==
struct _opt {
    char *option; // e.g. --group
    char *alias; // e.g. -G
    int reqArg; // Require Argument | 0: No 1: Yes
    int maxArgs; // -1: Undefined/ Unlimited
    int func; /* Run Function? 0: No 1: Yes
               * If No, it can be checked with function 'isOptEnabled'
               */
} opt;

struct _optL {
    struct opt avOpt[MAX_OPTS];
} optL;

struct _acOpt {
    struct opt *acOpt[MAX_OPTS];
} acOpt;

// == FUNC ==
void initOpts(void);

opts.c:

#include "opts.h"

#include <stdio.h>
#include <stdlib.h>

// == VAR ==
static struct optL *optList;
static struct acOpt *activeOpts;

// == CODE ==
void initOpt(void) {
    optList = (struct optL *)malloc(sizeof(struct optL *));
    activeOpts = (struct acOpt *)malloc(sizeof(struct acOpt *));
}

opts_test.c:

#include <stdio.h>
#include "../include/opts.h"

int main(void) {
    initOpts();
    return 0;
}

I compile it with:

gcc -c include/opts.c && gcc -c opts_test.c && gcc -o opts_test opts_test.o opts.o; rm -f *.o;

Output:

In file included from include/opts.c:5:0:    
include/opts.h:14:16: error: array type has incomplete element type ‘struct opt’     
     struct opt avOpt[];     
                ^~~~~       
include/opts.h:28:17: error: flexible array member in a struct with no named members     
     struct opt *acOpt[];      
                 ^~~~~       

Why gcc does not compile my File?
In a other Project i used exactly this code and it worked.
Now it does not working....

Emanuel Bennici
  • 426
  • 3
  • 13

1 Answers1

2

It looks like you are declaring a struct and then trying to give it another name. Try using typedef and then just use the new name without the "struct". Something like this.

Also, you are mallocing memory the size of a pointer to the struct and not the size of the struct.

// == VAR ==
typedef struct _opt {
    char *option; // e.g. --group
    char *alias; // e.g. -G
    int reqArg; // Require Argument | 0: No 1: Yes
    int maxArgs; // -1: Undefined/ Unlimited
    int func; /* Run Function? 0: No 1: Yes
               * If No, it can be checked with function 'isOptEnabled'
               */
} opt_t;


typedef struct _optL {
   opt_t avOpt[MAX_OPTS];
} optL_t;
Richard Johnson
  • 612
  • 1
  • 9
  • 20
  • No it does not work. Compiler Errors: include/opts.h:24:8: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘struct’ typdef struct _opt opt_t; ^~~~~~ include/opts.h:27:4: error: unknown type name ‘opt_t’ opt_t avOpt[MAX_OPTS]; ^~~~~ – Emanuel Bennici Dec 11 '17 at 18:23
  • It works fine for me. Post the exact line that is failing. – Richard Johnson Dec 11 '17 at 18:54