c - 为什么头文件可以包含自身?

标签 c header-files

谁能想到头文件包含自身的任何场景?

我在一个程序中看到它,这个包含在条件编译 block 下,至少我找不到任何真实条件。但是,我在想这种情况是否有任何技术要求?

最佳答案

是的,如果你想赢得 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>

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

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

关于c - 为什么头文件可以包含自身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18468006/

相关文章:

将 int 转换为 4 字节 char 数组 (C)

c++ - 嵌套命名空间中的重复符号

objective-c - Objective C - 调用另一个类

C++:为什么使用 ".hh"作为 C++ 头文件的扩展名的原因

c - 在 C 中的 while 循环中发布增量

c++ - 构建与 Dreamweaver 兼容的 C DLL

c - SIGSEGV,(貌似)由 printf 引起

c - 如何解决c中的冲突类型错误?

c++ - 头文件和c++文件的问题

c - 如何在 Clion 中自动生成 .h 文件的函数头?