Redefining enum enumerators with #define

巧了我就是萌 提交于 2020-01-03 12:33:13

问题


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.


回答1:


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.




回答2:


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.




回答3:


I would suspect it's for IDEs or other tools to understand that a symbol is defined in some way.



来源:https://stackoverflow.com/questions/6830602/redefining-enum-enumerators-with-define

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!