Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using c++ typedef/using type alias

Tags:

I am reading C++ primer book and completely don't understand one line:

 using int_array = int[4];   typedef int int_array[4]; // This line  for (int_array *p = ia; p != ia + 3; ++p) {       for (int *q = *p; q != *p + 4; ++q)           cout << *q << ' '; cout << endl;  } 

Ok typedef is same as using. Does it mean int[4][4] is now int and how to understand that? And what type is int_array in for loop?

Thanks

like image 396
Somethone Avatar asked Jul 08 '17 19:07

Somethone


People also ask

Is typedef just an alias?

typedef is a reserved keyword in the programming languages C and C++. It is used to create an additional name (alias) for another data type, but does not create a new type, except in the obscure case of a qualified typedef of an array type where the typedef qualifiers are transferred to the array element type.

Is using better than typedef?

In C++, 'using' and 'typedef' performs the same task of declaring the type alias. There is no major difference between the two. 'Using' in C++ is considered to define the type synonyms.

Does typedef create a new type?

Syntax. Note that a typedef declaration does not create types. It creates synonyms for existing types, or names for types that could be specified in other ways.

What can I use instead of typedef?

Alias-declaration or type-alias with 'using' statement offers a more flexible way to define type aliases than typedef, mainly because of alias templates.


2 Answers

TL;DR

Both are doing the exact same thing: Defining int_array as an alias of an array of 4 ints

Making Sense of the Syntax

using has a nice A = B notation that is generally much easier to understand.

using alias = type; 

typedef's notation is not quite backward. For a simple typedef

typedef type alias; 

but more complicated typedefs tend to sprawl. I suspect the syntax was modeled after how one would define a variable, but I can't find where I packed my copy of the old K&R C programming book and can't look that up at the moment.

int int_array[4]; 

would define int_array to be an array of 4 ints. Slapping typedef on the front

typedef int int_array[4]; 

makes int_array a type alias instead of a variable.

Another example,

int * intp; 

Defines intp to be a pointer to an int.

typedef int * intp; 

Defines intp to be an alias to the type pointer to an int.

This gets ugly with more complicated data types as the name of the typedefed alias may be buried somewhere in the middle of the definition. A typedefed function pointer for example:

typedef void (*funcp)(param_t param1, param_t param2, ...); 

vs using

using funcp = void (*)(param_t param1, param_t param2, ...); 

Making a 2D Array

If you want a 2D array you could

using int_array2D = int[4][4]; 

or you could define an array of int_array

using int_array2D = int_array[4]; 

And of course that means you can

using int_array3D = int_array2D[4]; 

and keep on going until the cows come home or you've packed on so many dimensions that The Doctor's brain melts.

like image 118
user4581301 Avatar answered Oct 07 '22 18:10

user4581301


This line does nothing as it is redundant

The lines

using int_array = int[4]; 

and

typedef int int_array[4]; 

do the same thing. See reference for using and typedef. You can leave one or the other out and the behaviour is the same. It is not an error to have two different declarations, as they are not conflicting (they do the exact same thing).

The first way of doing it (using the using keyword) was introduced with C++11 and is in my opinion easier to read, so I prefer it over the typedef version.

like image 32
plats1 Avatar answered Oct 07 '22 18:10

plats1