Search code examples
cembeddedpic18mplab

Conflicting declarations in XC8 when using extern struct


I have a variable that is a struct, defined in a .c file:

struct {
    int write_cursor;
    int read_cursor;
    message messages[10];
} out_messages = {0, 0};

To make it available in other files I have an .h file with:

extern struct {
    int write_cursor;
    int read_cursor;
    message messages[10];
} out_messages;

This worked with the Microchip C18 compiler. The XC8 compiler gives an error:

communications.c:24: error: type redeclared
communications.c:24: error: conflicting declarations for variable "out_messages" (communications.h:50)

Solution

  • The notation isn't correct, you can do:

    typedef struct {
        int write_cursor;
        int read_cursor;
        message messages[10];
    } Struct_out_messages;
    
    extern Struct_out_messages out_messages;
    

    and in a .c make the initialization.

    Struct_out_messages out_messages = {0, 0, {0}};
    

    This compiles in XC16 without any problem, hope it does also on XC8.