C++中#if和#ifdef区别

2024-12-24 22:20:09
推荐回答(5个)
回答1:

在你的例子中,是一样的效果。
#ifdef 和 #if defined 的区别在于,后者可以组成复杂的预编译条件,比如

#if defined (AAA) && defined (BBB)
xxxxxxxxx
#endif

#if defined (AAA) || VERSION > 12
xxxxxxxxx
#endif

而#ifdef 就不能用上面的用法,也就是说,当你要判断单个宏是否定义时
#ifdef 和 #if defined 效果是一样的,但是当你要判断复杂的条件时,只能用 #if

回答2:

都是条件编译。其原理都是一样的。但是还是有一丁点儿不同。请认真读以下知识,得出不同点。

----------------------------------------------------------------
条件编译是指按照给定的条件决定哪些源代码参与编译,而哪些源代码不参与编译,从而使一个源程序在不同编译条件下生不同的目标程序。C++提供几种不同形式的条件编译指令,可以将一个表达式或者某个宏是否被定义作为编译条件,主要用于设计便于调试的程序或可移值的程序。

条件编译指令有多种,其结构类似于if语句结构。条件编译指令分别以#if、#ifdef或#ifndef指令开始,中间可以有#else指令,最后以#endif指令表示一条编译指令的结束。下面给出条件编译指令常用的三种形式:

#if...[#else]...#endif

#ifdef...[#else]...#endif

#ifndef...[#else]...#endif

#if指令检测其后表达式的值是否为真,如果为真,则随后的源代码要参与编译,直到出#else或#endif;如果不为真,则随后的源代码不参与编译。#ifdef指令是#if defined指令的缩写,它检测其后的宏是否被定义,如果被定义过,则随后的源代码要参与编译。#ifndef指令也检测其后的宏是否被定义,但不同的是,只有当该宏没有被定义过,随后的源代码参与编译。

----------------------------------------------------------
我得出的结论是:
相同点:1,都是条件编译(废话,是吧?)
2,都是判断宏

不同点:
#if后面可以跟宏,但是也可以直接跟0/1
比如:

#if 0
....
#endif

但是#ifdef就不能直接跟0/1判断。

回答3:

以#开头的都是预编译指令,就是在正式编译之前,编译器做一些预处理的工作

#if 条件语句
程序段1 //如果条件语句成立,那么就编译程序段1
#endif
程序段2//如果条件不语句成立,那么就编译程序段2

#ifndef x//先测试x是否被宏定义过
#define 程序段1 //如果x没有被宏定义过,那么就编译程序段1
#endif
程序段2 //如果x已经定义过了则编译程序段2的语句,“忽视”程序段1。

#ifdef x //先测试x是否被宏定义过
程序段1 //如果x被宏定义过,那么就编译程序段1
#endif
程序段2 //如果x没有被定义过则编译程序段2的语句,“忽视”程序段1。

回答4:

你好 这两者都是条件编译指令 不同在于:

#if 常量表达式
程序。。。//当常量表达式非零时候才编译本段
#endif

可以这样使用:
#if 常量表达式
程序。。。 //常量表达式非零
#else
程序。。。 //常量表达式为零
#endif

#ifdef 标识符 //标识符经过#define定义过 则编译
程序。。。
#else
程序。。。
#endif

类似的还有#ifndef,避免多重包含

回答5:

#if 条件语句
程序段1 //如果条件语句成立,那么就编译程序段1
#endif
程序段2//如果条件不语句成立,那么就编译程序段2

#ifndef x//先测试x是否被宏定义过
#define 程序段1 //如果x没有被宏定义过,那么就编译程序段1
#endif
程序段2 //如果x已经定义过了则编译程序段2的语句,“忽视”程序段1。

#ifdef x //先测试x是否被宏定义过
程序段1 //如果x被宏定义过,那么就编译程序段1
#endif
程序段2 //如果x没有被定义过则编译程序段2的语句,“忽视”程序段1。

if就是判断语句,不是预编译指令。