Pushkar Mahajan
Pushkar Mahajan

Reputation: 130

What is the difference between the two ways we declared a struct?

As a beginner with C++ I was learning about linked list and other data structures. After looking at a few implementations online I found these two ways they defined struct. What is the difference between the two. In one we add "struct" before the next pointer, and in one we don't.

Way 1:

struct node
{
   int data;
   node *next;
};

Way 2:

struct node
{
   int data;
   struct node *next;
};

Upvotes: 4

Views: 268

Answers (6)

eerorika
eerorika

Reputation: 238341

What is the difference between the two.

The difference is that the latter (called elaborated type specifier) declares that node is a struct.

In this case, it is redundant to declare that node is a struct, because that has already been declared:

struct node
^^^^^^^^^^^ <-- node is a struct
{
   int data;
   node *next;
};

An example of a case where there is a difference:

struct a {
    //b* pointer;      // oops, we don't know what b is
    struct b* pointer; // OK, b is a struct
};

struct b{};

It is typically not absolutely necessary to use an elaborated type specifier, as it is possible to use a separate declaration instead:

struct b;

struct a {
    b* pointer;
};

struct b{};

Choice between them is personal preference.


I say typically because sometimes you need it to disambiguate a variable of same name from a type:

int foo;
struct foo{};

int main()
{
    foo = 10;            // refers to int
    struct foo instance; // refers to the struct
}

It is usually a bad design to use same name for multiple things, so this is not very typical.


Finally, it is sometimes desirable to write header files that can be included in both C and C++. Such header must use the common subset of both languages.

In C, node is not a type name, but a tag for a structure. It is necessary in C to refer to a struct tag using struct keyword.

Upvotes: 8

Arnav Borborah
Arnav Borborah

Reputation: 11789

struct node *next;

Is only necessary in C code. In C, doing:

node *next;

Is not allowed. However, in C++, you can use both methods. There is no difference between them in this case.

The only time you would need the struct keyword in C++ for a declaration would be if there is some sort of ambiguity or if the struct has not been defined yet. (An example for the first would the stat function, which is a function and a struct on POSIX systems).

Upvotes: 9

Christian Hackl
Christian Hackl

Reputation: 27528

The second version is required in C, but bad style in C++, and there are almost no situations in C++ in which you actually have to add the keyword like this.

Note that you don't have to write your own linked-list implementations in C++, unless it's for academic learning purposes. Use std::list or std::forward_list.

Upvotes: 3

Daniel
Daniel

Reputation: 1287

This is because C++ grew out of C and C's syntax, and the language kept both types of syntax even though the explicit use of struct to declare the type of a variable was no longer needed. There are some cases, i.e., to resolve ambiguity between different types/functions/etc. with the same name, where it would make a difference. Also by keeping this syntax valid in C++, it would help people port C code over to C++ without introducing an error.

In C, by default you had to always place the struct keyword in front of the name of the struct. So only Way #2 was valid C:

struct node
{
    int data;
    node *next; //error in C!
};

struct node
{
    int data;
    struct node *next; //compiles
};

But you would often see in C code that struct declarations were paired typedefs in order to create new types, such as:

typedef struct node_t
{
    int data;
    struct node *next;
} node;

And this would allow node to be used as a type without struct in front of it. In C++, it effectively automated this typedef for all struct and class types in the code, which is why you can use the struct or class name without the appropriate qualifier before it.

Upvotes: 1

463035818_is_not_an_ai
463035818_is_not_an_ai

Reputation: 122460

In your case there is no difference at all. However, consider this example:

struct foo { struct node* f; };   // <- this is fine
struct foo_broken { node* f; };   // <- wont compile

struct node { };

int main() {
    foo f;
    //foo_broken g;
}

Placing the keyword struct allows you to declare the member before you declare node. Without struct the compiler will issue an error (for foo_broken):

error: ‘node’ does not name a type

That is, placing the keyword struct acts like a forward declaration. To use foo you need to supply a declaration of node but it can come after the declaration of foo.

Upvotes: 1

Kaveh Vahedipour
Kaveh Vahedipour

Reputation: 3477

There is no difference between the two declarations in C++

Upvotes: 0

Related Questions