开发者

error expected specifier-qualifier-list before

开发者 https://www.devze.com 2022-12-10 08:22 出处:网络
I tried to compile this example: #include <stdio.h> #include <stdlib.h> #include <stddef.h>

I tried to compile this example:

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

main(){
    size_t distance;

    struct x{
        int a, b, c;
    } s_tr;

    distance = offsetof(s_tr, c);

    printf("Offset of x.c is %lu bytes\n", (unsigned long)distance);

    exit(EXIT_SUCCESS); 
}

I got an error: error expected specifier-qualifier-lis开发者_如何学Got before 's_tr'. what does it mean? The example i got from: http://publications.gbdirect.co.uk/c_book/chapter9/introduction.html


On second reading, it looks like someone accidentally inserted an x before the {. The original probably had an anonymous struct:

struct { int a, b, c; } s_tr;

You can rewrite it with a typedef like:

typedef struct { int a, b, c; } newtype;
newtype s_tr;

Here's some code I used to refresh my memory, with the various ways to declare a struct in C (anonymous, tagged, and typed):

// Anonymous struct
struct { int a,b; } mystruct1;

// Tagged struct
struct tag1 { int a,b; };
struct tag1 mystruct2; // The "struct" is not optional

// Typedef declaring both tag and new type
typedef struct tag2 { int a, b; } type1;
struct tag2 mystruct3;
type1 mystruct4; // Unlike tags, types can be used without "struct"


This code is (as far as I can tell) incorrect. You need to add a typedef to struct x if you want to refer to it as s_tr. Otherwise, s_tr doesn't really mean anything (and in my case, won't even compile).

 typedef struct x{
     int a, b, c;
 }s_tr;

However, this is not required. You could refer to the struct as x, but you have to put the struct keyword in front of it. Like this:

distance = offsetof(struct x, c);


Try this.

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

typedef struct { int a, b, c; } s_tr;

int main(int argc, char **argv){ 

    size_t distance; 

    distance = offsetof(s_tr, c);
    printf("Offset of x.c is %lu bytes\n",
                (unsigned long)distance);

    exit(EXIT_SUCCESS); 
}

Also, this question and answer from the C-FAQ might help your understanding:

Q: What's the difference between these two declarations?

struct x1 { ... };
typedef struct { ... } x2;

A: The first form declares a structure tag; the second declares a typedef. The main difference is that the second declaration is of a slightly more abstract type--its users don't necessarily know that it is a structure, and the keyword struct is not used when declaring instances of it:

x2 b;

Structures declared with tags, on the other hand, must be defined with the

struct x1 a;

form. [footnote]

(It's also possible to play it both ways:

typedef struct x3 { ... } x3;

It's legal, if potentially obscure, to use the same name for both the tag and the typedef, since they live in separate namespaces. See question 1.29.)


offsetof() requires a type for the first argument.
You passing it an object of type struct x.

0

精彩评论

暂无评论...
验证码 换一张
取 消