Quantcast
Channel: Active questions tagged gcc - Stack Overflow
Viewing all articles
Browse latest Browse all 22148

"Variably modified 'variable_name' at file scope" with size defined in macro [duplicate]

$
0
0

This question already has an answer here:

I know there is some questions related to this error:
thread1, thread2, thread3, thread4,...

The difference is, I don't use variables to define the size, but macros.

Here is what I do:

#define     SIZE_A      250                      // Real world value
#define     SIZE_B       80                      // Real world value
#define     SCALE         0.25                   // Real world value
#define     TOTAL_A     (uint16_t)(SIZE_A/SCALE)
#define     TOTAL_B     (uint16_t)(SIZE_B/SCALE)
#define     TOTAL       TOTAL_A*TOTAL_B

#define     SIZE_1      (uint16_t)(TOTAL*0.3)


#define     SIZE_2      4000

typedef struct {
    toto_t  toto[TOTAL_A][TOTAL_B];
    foo_t   foo[SIZE_1][SIZE_2];
} bar_t;

As you can see, I've got three macros (SIZE_A, SIZE_B, SCALE) which represent real things. From those I define the sizes (TOTAL_A, TOTAL_B) of a 2 dimensional array (toto_t toto), and the total number of cells in this array (TOTAL). Then I take a piece of that total (SIZE_1) to define the size of an other array I want to create (foo_t foo).

This way gcc throw the error: Variably modified 'foo' at file scope. So, I looked at the preprocessor output:

typedef struct {
    toto_t toto[(uint16_t)(250/0.25)][(uint16_t)(80/0.25)];
    foo_t  foo[(uint16_t)((uint16_t)(250/0.25)*(uint16_t)(80/0.25)*0.3)][4000];
} bar_t;

As we can see, the preprocessor is doing is job well. All macros are replaced by the literal value. So there is only constant values in the array size.

My question
Why gcc can not compute the sizes of the arrays? And is there an option to force it to do the computation?

I compile with this option -O3 -Wall -Wextra -Werror.

Testing:

Create a test.h and put the code I posted and add typedef uint16_t toto_t; typedef uint16_t foo_t; at the begining. And create a test.c file with:

#include <stdio.h>
#include <inttypes.h>

#include "test.h"

int main() {
    printf("hello world\n");

    return 0;
}

Viewing all articles
Browse latest Browse all 22148

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>