I've come across some C++ code that has the following:
typedef Request Request;
Is this just a no-op or does this typedef actual have an effect, and if so, what effect does it have?
It can almost be necessary when dealing with templates that require multiple and/or variable parameters. The typedef helps keep the naming straight. Not so in the C programming language. The use of typedef most often serves no purpose but to obfuscate the data structure usage.
The typedef keyword allows the programmer to create new names for types such as int or, more commonly in C++, templated types--it literally stands for "type definition". Typedefs can be used both to provide more clarity to your code and to make it easier to make changes to the underlying data types that you use.
typedef is used to define new data type names to make a program more readable to the programmer. For example: | main() | main() { | { int money; | typedef int Pounds; money = 2; | Pounds money = 2 } | } These examples are EXACTLY the same to the compiler.
typedef is necessary for many template metaprogramming tasks -- whenever a class is treated as a "compile-time type function", a typedef is used as a "compile-time type value" to obtain the resulting type.
Typedef cannot be used to change the meaning of an existing type name (including a typedef-name). Once declared, a typedef-name may only be redeclared to refer to the same type again.
You can't "typedef a struct", that doesn't mean anything.
You can read all rules relative to typedef specifier for C++2003 ANSI ISO IEC 14882 2003 in section 7.1.3. In 7.1.3, 2) it have been said the identity typedef is allowed if the name already refers to some type.
This is legal:
typedef int Request;
typedef Request Request; // Redefines "Request" with no effect
And that it is not:
typedef Request Request; // Illegal, first "Request" doesn't name a type.
The standard has a specific example relating to this. C++2003, §7.1.3/2:
In a given non-class scope, a typedef specifier can be used to redefine the name of any type declared in that scope to refer to the type to which it already refers. [Example:
typedef struct s { /* ... */ } s;
typedef int I;
typedef int I;
typedef I I;
—end example]
In 7.1.3, 3) it have been said that use typedef to redefine type to alias to another type is prohibited
If Request
is only passed as a parameter it seems to be a opaque pointer.
There should be a
typedef struct Request Request
somewhere in the code. (see comments on your question)
This is used to define an API and hide implementation details. So you can later change the implementation without changing the API again.
The client does not need to know anything about the acutal type - its just kind of a handle.
Everything you want to do with it has to be done with the api methods (creation, delete, load, init, ...)
Usually the handle Request
will be casted to something more meaningfull in the implementation of the api. This was/is usually done in old C.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With