#define one 0
#ifdef one
printf("one is defined ");
#ifndef one
printf("one is not defined ");
Run Code Online (Sandbox Code Playgroud)
在这个有什么作用#ifdef和#ifndef,什么是输出?
pax*_*blo 129
根据条件,预处理器中的一个ifdef/endif或ifndef/endif 一对内的文本将被保留或移除.ifdef意味着"如果以下被定义"而ifndef意味着"如果下面是不限定".
所以:
#define one 0
#ifdef one
printf("one is defined ");
#endif
#ifndef one
printf("one is not defined ");
#endif
Run Code Online (Sandbox Code Playgroud)
相当于:
printf("one is defined ");
Run Code Online (Sandbox Code Playgroud)
因为one定义所以它ifdef是真的而且ifndef是假的.这不要紧,它被定义为.一个类似的(在我看来更好)代码片段将是:
#define one 0
#ifdef one
printf("one is defined ");
#else
printf("one is not defined ");
#endif
Run Code Online (Sandbox Code Playgroud)
因为这在这种特定情况下更清楚地指明了意图.
在您的特定情况下,ifdef自one定义后未删除后的文本.后的文本ifndef 是出于同样的原因除去.endif在某些时候需要有两条关闭线,第一条线将重新开始包含线,如下所示:
#define one 0
+--- #ifdef one
| printf("one is defined "); // Everything in here is included.
| +- #ifndef one
| | printf("one is not defined "); // Everything in here is excluded.
| | :
| +- #endif
| : // Everything in here is included again.
+--- #endif
Run Code Online (Sandbox Code Playgroud)
Pat*_*ter 64
有人应该提一下,在这个问题上有一个小陷阱.#ifdef将仅检查是否#define通过命令行或通过命令行定义了以下符号,但其值(实际上它的替换)是无关紧要的.你甚至可以写
#define one
Run Code Online (Sandbox Code Playgroud)
预编译器接受了.但如果你使用#if它是另一回事.
#define one 0
#if one
printf("one evaluates to a truth ");
#endif
#if !one
printf("one does not evaluate to truth ");
#endif
Run Code Online (Sandbox Code Playgroud)
会给one does not evaluate to truth.关键字defined允许获得所需的行为.
#if defined(one)
Run Code Online (Sandbox Code Playgroud)
因此相当于 #ifdef
该#if构造的优点是允许更好地处理代码路径,尝试使用旧#ifdef/ #ifndef对执行类似的操作.
#if defined(ORA_PROC) || defined(__GNUC) && __GNUC_VERSION > 300
Run Code Online (Sandbox Code Playgroud)