msc*_*msc 16 c macros c-preprocessor
我有代码,我想有两种模式,debug和verbose.我在我的头文件中定义它们,
#define verbose TRUE
#define debug TRUE
Run Code Online (Sandbox Code Playgroud)
到目前为止,在我的代码中,我刚刚使用过
#if(debug)
//code
#endif
Run Code Online (Sandbox Code Playgroud)
但使用起来更合适
#ifdef debug
// code
#endif
Run Code Online (Sandbox Code Playgroud)
我读了一些关于预处理器宏的内容,但当时没有意义.所以,我有疑问,#if defined MACRO相当于#ifdef MACRO?哪个更好地启用/禁用特定代码段?
gna*_*729 18
#ifdef MACRO
#if defined (MACRO)
Run Code Online (Sandbox Code Playgroud)
会做同样的事情.但是,定义的(MACRO)只是一个在#if内部计算为0或1的表达式,它可以与其他表达式组合.例如
#if defined (MACRO) && ! defined (MACRO2)
// Do this
#else
// Do that
#endif
Run Code Online (Sandbox Code Playgroud)
尝试用#ifdef做到这一点 - 你不能,除非你的代码变得非常笨拙.
#if defined(MACRO)是相同的#ifdef MACRO,但更长.另一方面,它允许用||或添加额外的条件&&.
#if MACRO类似#ifdef MACRO但不是100%.如果MACRO是0那么#if MACRO将是负面的-它需要MACRO加以界定和不可0.#ifdef仅检查是否定义了甚至没有值(#define MACRO).
现在使用#if和启用/禁用值为1或0的现代是现代的:
#define FLAG_X 1 // or 0
不,他们完全不相同.一#if MACRO,如果分支被编译MACRO的计算结果为非零.在另一方面,#ifdef MACRO如果分支被编译MACRO的定义,不管它的计算结果为.所以
#include <stdio.h>
#define VAR_SET_TO_TRUE 1
#define VAR_SET_TO_FALSE 0
int main()
{
#if VAR_SET_TO_TRUE
printf("#if VAR_SET_TO_TRUE\n");
#endif
#if VAR_SET_TO_FALSE
printf("#if VAR_SET_TO_FALSE\n");
#endif
#if VAR_UNSET
printf("#if VAR_UNSET\n");
#endif
#ifdef VAR_SET_TO_TRUE
printf("#ifdef VAR_SET_TO_TRUE\n");
#endif
#ifdef VAR_SET_TO_FALSE
printf("#ifdef VAR_SET_TO_FALSE\n");
#endif
#ifdef VAR_UNSET
printf("#ifdef VAR_UNSET\n");
#endif
}
Run Code Online (Sandbox Code Playgroud)
将输出
#if VAR_SET_TO_TRUE
#ifdef VAR_SET_TO_TRUE
#ifdef VAR_SET_TO_FALSE
Run Code Online (Sandbox Code Playgroud)
请注意,该行printf("#ifdef VAR_SET_TO_FALSE\n");是在printf("#if VAR_SET_TO_FALSE\n");没有行的情况下编译的.第一个是编译的,因为VAR_SET_TO_FALSE已定义,即使它的值是false.