C typedef of pointer to structure

后端 未结 6 851
暖寄归人
暖寄归人 2020-11-27 13:52

I had come across the following code:

typedef struct {
        double x;
        double y;
        double z;
} *vector;

Is this a v

相关标签:
6条回答
  • 2020-11-27 14:19

    Yes it is. But it is imho bad style. Not the direct declaration of the struct, but the direct declaration of a pointer type. It is obfuscation, the information that a given variable or parameter is a pointer (and to a lesser extent for arrays) is extremly important when you want to read code.

    When reviewing code it is often difficult to see at first glance which function could have a side effect or not. If the types used hide this information, it adds a memorisation burden to the reader.

    int do_fancy(vector a, vector b); 
    

    or

    int do_fancy(vector *a, vector *b);
    

    in the first case I can miss easily that that function may change the content of a or b. In the second I'm warned.

    And when actually writing code I also know directly to write a->x and not have the compiler tell me error: request for memberx' in something not a structure or union`.

    I know, it looks like a personal taste thing, but having worked with a lot of external code, I can assure you that it's extremely annoying when you do not recognize the indirection level of variables. That's one reason I also dislike C++ references (in Java it's not because all objects are passed by reference, it's consistent) and Microsoft's LPCSTR kind of types.

    0 讨论(0)
  • 2020-11-27 14:27

    Yes it is valid. If you need more "security" you can also do

    typedef struct vector_{
            double x;
            double y;
            double z;
    } *vector;
    

    then you can use both

    struct vector_ *var;
    vector var;
    

    But don't forget the ending semi-colon.

    Using only typedef means that you name it that way. otherwise it'd be more or less anonymous.

    0 讨论(0)
  • 2020-11-27 14:29

    Absolutely valid. Usually, you can take full advantage of this way by defining two types together:

    typedef struct
    {
     int a;
     int b;
    } S1, *S1PTR;
    

    Where S1 is a struct and S1PTR is the pointer to this struct.

    0 讨论(0)
  • 2020-11-27 14:31

    It a valid one, what it does is it defines a new type. As @Alex said, it would be useful to define a type and pointer type.

    You could create more pointers just by using

    S1PTR ptr1, ptr2, ptr3, ...;  
    

    instead of

    S1 *ptr1, *ptr2, *ptr3, ...;
    
    0 讨论(0)
  • 2020-11-27 14:42

    Yes it is valid as described in above answers. A small suggestion, it would be better if you provide a tag name too, as follows. This would help some IDEs to better parse your code.

    typedef struct vactor_tag {
            double x;
            double y;
            double z;
    } *vector;
    
    0 讨论(0)
  • 2020-11-27 14:44

    yes...saves you the trouble of constantly typing the word 'struct' everytime you declare the vector struct or a pointer to it.

    0 讨论(0)
提交回复
热议问题