为什么头文件可以包含自己?

任何人都可以想到头文件包含自身的任何场景吗?

我在其中一个程序中看到它并且这个包含在条件编译块下,至少我找不到任何真实的条件。但是,我在想这样的场景是否有任何技术要求?

是的,如果你想赢得国际混淆C代码竞赛 。 这是一个很好的例子(源文件名为isaak.c ):

 main(){} #define P define #PU ifdef #P main Si #U y #undef y #include "isaak.c" Pb #else char*K="4499999;8 9+jW*':'TZhD m:*h.4-j'9(z7Q>r*:G#FS]mATIdMZY^HaKFZZ\ JyJw:X49@eJj1,Z'\\c^jGU@IXTF@9P2i:gAZx0pD*W3\\

“;*++H;)*(FO=(*H+5&129)+1)= *H;F #PW sprintf( O= -132;}I/**/r(){if((N= *IO/**/O%(21 O -5)+81 O 16)==107)N+= #undef I *K++&15;*F++=N;return*K;} #undef O #PIK #PO + #UN exit(N){F=WH=S,”%5060d”)+385;while(Br(),++B,Kr())F+=(N= *B++/26-1)?(“)21[“[N]-46)*N*4-22:-3194;while(*–K!=9){while(!(*++H+5&64)); F=(40-“(\206/”[((HS)%130+45)/57]<<3)+H;*F++=*H++;*F= *H==106?32:*H;Y();W WF-131,"%-3d",++Bk)+260,"%3d",V+= *C?*C:"hijpqv"[*--C]-106);Pb();}for(H=S;*H||(int)_exit(0);H+=130)write(1,1+W F+3,"%c%-73.73s\n",0,H),74);} #endif #undef U #PU ifndef #include

严肃地说,头文件通常不应该尝试直接包含它自己,因为这通常只是一个坏主意(你必须使用条件编译来控制递归,并且快速变得毛茸茸)。 如果头文件间接地(通过中间头文件)包含自身,则可能是错误,因为中间头文件将无法使用原始头文件中的定义。

也就是说,在熟练的从业者手中,以及非常具体的需求,可以在预处理器中进行计算。 这种计算可能是生成编译时构造,执行手动循环展开或执行各种其他“预处理器技巧”所必需的。 在所有这些情况下,精心设计使用自包含或多包含。