Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Redefining enum enumerators with #define

I have spotted something in C header files what I can't figure out what is for. For example in file bits/socket.h there is an enumeration type enum __socket_type, but after every enumerator there is a define macro which defines the same. Example:

enum __socket_type
{
   SOCK_STREAM = 1,
   #define SOCK_STREAM SOCK_STREAM 
   ...
};

I have been unable to find out what this is for. Please enlighten me. I don't even know how to form right question for querying google nor this site search box.

like image 399
BeginEnd Avatar asked Jul 26 '11 13:07

BeginEnd


People also ask

Is enum and enumerator same?

In computer programming, an enumerated type (also called enumeration, enum, or factor in the R programming language, and a categorical variable in statistics) is a data type consisting of a set of named values called elements, members, enumeral, or enumerators of the type.

What is enumeration in enum?

An enumeration type (or enum type) is a value type defined by a set of named constants of the underlying integral numeric type. To define an enumeration type, use the enum keyword and specify the names of enum members: C# Copy.

What is enumeration data type with example?

An enumerated type is a type whose legal values consist of a fixed set of constants. Common examples include compass directions, which take the values North, South, East and West and days of the week, which take the values Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, and Saturday.

Can you have 2 enums the same value?

CA1069: Enums should not have duplicate values.


2 Answers

A prepreprocessor macro will never expand recursively, so what such a #define does is leave the name in place whereever it is used. Such things are useful when you want to have a preprocessor feature test.

#ifdef SOCK_STREAM
..
#endif

can be used to conditionally compile some code afterwards.

Edit: So this combines the cleaner approach of enumerations (implicit values without collisions and scoping) with preprocessor tests.

like image 59
Jens Gustedt Avatar answered Oct 25 '22 01:10

Jens Gustedt


The only thing I can think of is because people see a constant in all-caps, say NUM_FILES, they'll think it's a macro and are tempted to write this:

#ifdef NUM_FILES

Now normally this would fail, but if you write #define NUM_FILES NUM_FILES it behaves as a macro for the preprocessor and IDE's and as an enum for the code itself.

like image 32
orlp Avatar answered Oct 25 '22 00:10

orlp