C++中#if #ifdef 的作用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中#if #ifdef 的作用相关的知识,希望对你有一定的参考价值。

用编译器经常会自动生成这些,我自己很少用,想知道经常用的这些的介绍,谢谢了。
谢谢大家的回答
有没有那本书里面有比较详细一点的介绍类似的这些作用,或者给个超链接

一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件
编译”。有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。
条件编译命令最常见的形式为:
/////////
#ifdef 标识符
程序段1
#else
程序段2
#endif

它的作用是:当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2。
其中#else部分也可以没有,即:
#ifdef
程序段1
#denif
参考技术A 都是条件编译。其原理都是一样的。但是还是有一丁点儿不同。请认真读以下知识,得出不同点。
----------------------------------------------------------------
条件编译是指按照给定的条件决定哪些源代码参与编译,而哪些源代码不参与编译,从而使一个源程序在不同编译条件下生不同的目标程序。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判断。
参考技术B 以#开头的都是预编译指令,就是在正式编译之前,编译器做一些预处理的工作
#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。
参考技术C #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就是判断语句,不是预编译指令。
参考技术D 你好
这两者都是条件编译指令
不同在于:
#if
常量表达式
程序。。。//当常量表达式非零时候才编译本段
#endif
可以这样使用:
#if
常量表达式
程序。。。
//常量表达式非零
#else
程序。。。
//常量表达式为零
#endif
#ifdef
标识符
//标识符经过#define定义过
则编译
程序。。。
#else
程序。。。
#endif
类似的还有#ifndef,避免多重包含

C语言中#if,#if defined ,#ifdef,extern的用法描述

本文来自网络,如有侵权请联系删除,谢


1、#if 和#ifdef

当asd_eee表达式存在而且,值为ture的时候接续向下执行

例如

#define TARGET_LITTLE_ENDINA 1#define TARGET_BIG_ENDINA 0#ifdef TARGET_LITTLE_ENDINAcall little endina function#elsecall big endina function#endif


上面的今天写的代码,发现我不管把TARGET_LITTLE_ENDINATARGET_BIG_ENDINA定义成0或者1,调用的都是little endina函数,一直找不到问题所在,看看代码也没有什么问题。经过分析和查找相关的文档,原来是自己没有理解#if和#ifdef之间的区别。
对于#if需要是一个表达式,如果表达式为1则调用#if下面的代码。
对于#ifdef需要的只是这个值有没有定义,并不关心这个值是什么。
表明之间的区别问题就变得非常的容易,只要把上述代码中的#ifdef改成#if就可以达到目的。

2 ,#if defined

 

,#if defined 的意思是是是否对某一个表达式进行了定义

例如 

#if defined(_WIN32) || defined(WIN32)# include <io.h>#else........

例如上面这段代码,如果既没有定义_WIN32也没有定义WIN32,那么include头文件 io.h

3 extern

1.extern用在变量声明中常常有这样一个作用,你在*.c文件中声明了一个全局的变量,这个全局的变量如果要被引用,就放在*.h中并用extern来声明。
2.如果函数的声明中带有关键字extern,仅仅是暗示这个函数可能在别的源文件里定义,没有其它作用。即下述两个函数声明没有区别:
extern int f(); 和int f();

=================================
如果定义函数的c/cpp文件在对应的头文件中声明了定义的函数,那么在其他c/cpp文件中要使用这些函数,只需要包含这个头文件即可。
如果你不想包含头文件,那么在c/cpp中声明该函数。一般来说,声明定义在本文件的函数不用“extern”,声明定义在其他文件中的函数用“extern”,这样在本文件中调用别的文件定义的函数就不用包含头文件
include “*.h”来声明函数,声明后直接使用即可。

=================================
举个例子:
//extern.cpp内容如下:

// extern.cpp : Defines the entry point for the console application.//
#include "stdafx.h"extern print(char *p);int main(int argc, char* argv[]){char *p="hello world!";print(p);return 0;}//print.cpp内容如下#include "stdafx.h"#include "stdio.h"print(char *s){printf("The string is %s/n",s);}

结果程序可以正常运行,输出结果。如果把“extern”去掉,程序依然可以正常运行。

由此可见,“extern”在函数声明中可有可无,只是用来标志该函数在本文件中定义,还是在别的文件中定义。只要你函数在使用之前声明了,那么就可以不用包含头文件了。

精选文章



围观


热文



热文



热文



热文



END

如果您觉得本篇文章对您有帮助请转发给更多的人

顺手点一下“在看”也是对小编最大的支持


以上是关于C++中#if #ifdef 的作用的主要内容,如果未能解决你的问题,请参考以下文章

C++中 #ifdef的妙用详解

这些 C++ 代码片段有啥作用?

你真的知道C语言里extern "C" 的作用吗?

#ifdef 和 #ifndef 的作用

#ifdef __cplusplus extern “C“{ #endif的作用

#ifdef...#endif作用