任何人都可以想到头文件包含自身的任何场景吗?
我在其中一个程序中看到它并且这个包含在条件编译块下,至少我找不到任何真实的条件。但是,我在想这样的场景是否有任何技术要求?
答案 0 :(得分:6)
是的,如果你想赢得International Obfuscated C Code Contest。这是一个很好的例子(源文件名为isaak.c
):
main(){}
#define P define
#P U 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\\<ZZs1:.~Z8U:P<\\:ZOI0GBPZ7",*H
,S[5202],*B="oA9BA6iN`]`Ph>5F4::M6A69@6I{g[Za__]NPV``aV\177E4C5CG;4C<BEJG;\
?LGlSZ[Y_!oYi@uXPzLFyPOYP][]`RTaQo86564CAHCG4ES",*F,N;int Bk,V;Y
#endif
#P C K/16-2
(){char*H;F O=-263;for(H="$+---+|||";*++H;)*(F O=(*H+5&129)+1)= *H;F
#P W 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
#P I K
#P O +
#U N
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/"[((H-S)%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
#P U ifndef
#include <stdio.h>
严肃地说,头文件通常不应该试图直接包含它自己,因为这通常只是一个坏主意(你必须使用条件编译来控制递归,并且快速变得毛茸茸)。如果头文件间接地(通过中间头文件)包含自身,则可能是错误,因为中间头文件将无法使用原始头文件中的定义。
也就是说,在熟练的从业者手中,以及非常具体的需求,可以在预处理器中进行计算。这种计算可能是生成编译时构造,执行手动循环展开或执行各种其他“预处理器技巧”所必需的。在所有这些情况下,精心设计使用自我包含或多包含。