learn_C_deep_14 (条件编译的基本使用与理解)

这篇具有很好参考价值的文章主要介绍了learn_C_deep_14 (条件编译的基本使用与理解)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

条件编译

1.条件编译如何使用?

2.为何要有条件编译?

3. 条件编译都在哪些地方用?


条件编译

1.条件编译如何使用?

        C语言的条件编译是一种在程序编译时根据条件选择不同代码段进行编译的技术。条件编译可以用于实现代码跨平台,开启或关闭某些功能,以及调试等情况。

#ifdef` 指令用于判断某个宏是否被定义,不论我们定义的宏为真为假,如果被定义则编译下面的代码块,否则跳过:

#include <stdio.h>
//#define PTINT
//#define PTINT 1  //真
//#define PTINT 0  //假
int main()
{
#ifdef PRINT //PRINT并没有被[定义],所以代码只保留#else部分
	printf("hello world!\n");
#else
	printf("Non Message!\n");//这句代码会被输出
#endif
	return 0;
}

与 `#ifdef` 相对应的是 `#ifndef`,它用于判断某个宏是否未被定义

#include <stdio.h>
//#define DEBUG
int main()
{
#ifndef DEBUG //DEBUG并没有被[定义],所以代码会输出#ifndef内容
	printf("hello debug\n");//这句代码会被输出
#else
	printf("hello release\n");
#endif
	return 0;
}

`#if` 指令可以根据表达式的值来判断是否编译下面的代码块。

// 单个条件的情况
#include <stdio.h>
//报错
//#define DEBUG
//定义了,为假
//#define DEBUG 0
//定义了,为真
#define DEBUG 1
int main()
{
#if DEBUG
	printf("hello bitworld\n");
#endif
		return 0;
}
//带else的情况
#include <stdio.h>
//报错
//#define DEBUG
//定义了,为假
#define DEBUG 0
//定义了,为真
//#define DEBUG 1
int main()
{
#if DEBUG
	printf("hello world\n");
#else
	printf("hello bit\n");
#endif
	return 0;
}
//多条件的情况
//代码一:
#include <stdio.h>
//#define DEBUG 0
//#define DEBUG 1
//#define DEBUG 2
#define DEBUG 3
int main()
{
#if DEBUG==0
	printf("hello world 0\n");
#elif DEBUG==1
	printf("hello world 1\n");
#elif DEBUG==2
	printf("hello world 2\n");
#else
	printf("hello else\n");
#endif
	return 0;

//代码二:
#include <stdio.h>
#define DEBUG -1
//#define DEBUG 0
//#define DEBUG 1
//#define DEBUG 2
int main()
{
#if DEBUG<0
	printf("hello world 0\n");
#elif DEBUG<1
	printf("hello world 1\n");
#elif DEBUG<2
	printf("hello world 2\n");
#else
	printf("hello else\n");
#endif
	return 0;
}

#if模拟#ifdef

#include <stdio.h>
#define DEBUG
int main()
{
#if defined(DEBUG)
	printf("hello debug\n");//这句话会被输出
#else
	printf("hello release\n");
#endif
	return 0;
}

#if模拟#ifndef

#include <stdio.h>
//#define DEBUG
int main()
{
#if !defined(DEBUG)
    printf("hello debug\n");//这句话会被输出
#else
    printf("hello release\n");
#endif
    return 0;
}

练习

#include <stdio.h>
#define C
#define CPP
int main()
{
#if defined(C) && defined(CPP)
	//#if (defined(C) && defined(CPP)) //建议使用这种方式
	printf("hello c&&cpp\n");//这句话会被输出
#else
	printf("hello other\n");
#endif
	return 0;
}

        这段代码使用了条件编译指令,定义了两个宏C和CPP,并且使用#if defined指令判断是否同时定义了这两个宏。

        当同时定义了C和CPP时,程序执行#if defined(C) && defined(CPP)条件满足,会输出"hello c&&cpp"。如果C和CPP没有同时定义,则条件不满足,会输出"hello other"。

在这段代码中,#if defined(C) && defined(CPP)和#if (defined(C) && defined(CPP))的效果是相同的。两者都是判断C和CPP是否都已经被定义了,如果都被定义,则条件满足,执行相应的代码块。

        注意,程序中使用#define指令定义的宏只是简单的文本替换,不会经过类型检查和语法检查。因此在使用宏时需要谨慎,避免出现不必要的错误。

#include <stdio.h>
#define C
//#define CPP
int main()
{
#if defined(C) || defined(CPP)
	//#if (defined(C) || defined(CPP))
	printf("hello c||cpp\n");//这句话会被输出
#else
	printf("hello other\n");
#endif
	return 0;
}

        这段代码与前面的稍有不同,它使用#if defined指令判断了C和CPP是否至少有一个被定义了,即#if defined(C) || defined(CPP)。当C和CPP中至少有一个被定义时,条件满足,会输出"hello c || cpp"。否则条件不满足,会输出"hello other"。

        和前面一样,注释掉#define CPP的语句,则只有C被定义,条件不满足,会输出"hello other"。

        需要注意的是,#if defined(C) || defined(CPP)和#if (defined(C) || defined(CPP))的效果也是相同的,这两种写法都是判断C和CPP是否至少有一个被定义了,如果有,则条件满足,执行相应的代码块。

#include <stdio.h>
#define C
#define CPP
int main()
{
#if !(defined(C) || defined(CPP))
	printf("hello c || cpp\n");//这句话会被输出
#else
	printf("hello other\n");
#endif
	return 0;
}

        这是一个C语言程序,定义了两个宏:C和CPP,并在主函数中使用了#if和#ifndef预编译指令。

        #if !(defined(C) || defined(CPP))表示如果C和CPP中的宏都未定义,则执行if语句内的代码,输出"hello c || cpp"。但是由于C和CPP都被定义了,所以if语句的条件不成立,所以会执行else语句内的代码,输出"hello other"。因此,这个程序的输出结果是"hello other"。

#include <stdio.h>
#define C
#define CPP
int main()
{
#if defined(C)
	#if defined (CPP)
		printf("hello CPP\n");//这句话会被输出
	#endif
	printf("hello C\n");//这句话会被输出
#else
	printf("hello other\n");
#endif
	return 0;
}

        这是一个C语言程序,其中使用了条件编译指令。程序定义了两个宏,分别为C和CPP。在main函数中,先判断宏C是否被定义,如果被定义,则进入C语言的条件编译指令中。在这个指令中,又判断宏CPP是否被定义,如果被定义,则输出"hello CPP\n"。无论宏CPP是否被定义,都会输出"hello C\n"。

        如果宏C没有被定义,则程序进入另一个条件编译指令中,输出"hello other\n"。因此,运行该程序,会输出"hello CPP\n"和"hello C\n"。

#include <stdio.h>
#define C
#define CPP
int main()
{
#if defined(C)
	printf("hello C\n");
#elif defined (CPP)
	printf("hello CPP\n");
#else
	printf("hello other\n");
#endif
	return 0;
}

        这是一个C语言程序,其中定义了两个宏C和CPP。在main函数中,同样使用了条件编译指令#if-elif-else-endif。在这个指令中,先判断宏C是否被定义,如果被定义,则输出"hello C\n"。如果宏C没有被定义,再判断宏CPP是否被定义,如果被定义,则输出"hello CPP\n"。如果宏C和CPP都没有被定义,则输出"hello other\n"。

        由于宏C和CPP都被定义了,因此运行该程序会输出"hello C\n"。

#if 和 #ifdef的区别

        #if和#ifdef是C预处理中的条件编译指令,它们的作用都是根据某个宏的定义情况来判断编译代码的方式。

        #if的语法形式为#if 常量表达式,它会首先对常量表达式进行求值,如果表达式的值为真,则编译这个#if与对应的#endif之间的代码,否则忽略这个#if与对应的#endif之间的代码。

#ifdef的语法形式为#ifdef 宏名,它用来判断某个宏是否定义了。如果宏被定义了,则编译#ifdef与对应的#endif之间的代码,否则忽略这个#ifdef与对应的#endif之间的代码。

        它们的主要区别在于#if是对表达式的求值结果进行判断,可以进行更加复杂的条件判断,而#ifdef只是判断宏是否被定义,不能进行表达式求值。另外,由于#if可以进行表达式求值,因此在某些情况下,#if比#ifdef会更加灵活和方便。

条件编译和宏替换谁先执行

宏替换先于条件编译执行。

        在C语言中,预处理器会先对源代码进行宏替换,将源代码中的宏名称替换为相应的宏定义,然后再对替换后的代码进行条件编译。也就是说,条件编译是在宏替换之后进行的。这也就意味着,在条件编译中对宏的定义或者值的改变,并不会影响到之前宏替换的结果。

在进行宏替换时,预处理器会根据宏定义中的替换列表来进行替换。如果宏定义中包含了其他宏的调用,那么预处理器会先对这些宏进行替换,然后再对当前宏进行替换。这种替换过程会一直持续下去,直到不包含其他宏的调用为止。

        总的来说,宏替换是在条件编译之前进行的,而且它是一个递归的过程,可以包含其他宏的调用,最终将源代码中的所有宏替换为相应的宏定义后,再对替换后的代码进行条件编译。

条件编译可以用来注释代码吗?推不推荐?

        条件编译可以用来注释代码,但不是最佳实践,因为它会影响到代码的可读性和可维护性。

        在条件编译中,使用了类似于`#if 0 ... #endif`的语句来注释掉代码,它会导致这段代码被编译器忽略掉,从而达到注释的效果。如果这种语句对应的条件值为假,则这段代码将永远不会被编译,从而达到注释掉代码的效果。

        然而,使用条件编译来注释代码会使得代码难以阅读,特别是在复杂的代码环境中。因为代码注释完全可以通过标准注释语法来实现,这样会更加清晰易懂,也更易于维护。而使用条件编译来注释代码,会给读代码的人带来很大的困扰,因为他们不得不去寻找代码中存在的所有条件编译语句,以了解到底有哪些代码是被注释掉的。

        因此,推荐使用标准注释语法来进行注释,并尽可能避免使用条件编译来注释掉代码。这样会使代码更具可读性和可维护性。

结论:条件编译本质是让编译器进行代码裁剪。

2.为何要有条件编译?

learn_C_deep_14 (条件编译的基本使用与理解)

3. 条件编译都在哪些地方用?

learn_C_deep_14 (条件编译的基本使用与理解)文章来源地址https://www.toymoban.com/news/detail-461314.html

到了这里,关于learn_C_deep_14 (条件编译的基本使用与理解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MATLAB Deep learning

    深度学习是一种机器学习,而机器学习是一种人工智能。 机器学习的本质 :机器学习是一种从“数据”中找到“模型”的技术。在这里,数据的字面意思是指文档、音频、图像等信息。这个“模型”是机器学习的最终产物。 机器学习的创建是为了 解决分析模型几乎不可用的

    2024年01月17日
    浏览(122)
  • deep learning 代码笔记

    len (X)总是返回第0轴的长度。 What are the shapes of summation outputs along axis 0, 1, and 2? f ( x ) = ||  x||   2 的梯度 自动微分法计算: 因此,梯度是x的单位向量。在x = 0处的梯度在数学上是未定义的,但是自动微分返回零。要小心,在这种情况下可能会出现差异。 默认情况下,最后一

    2024年02月21日
    浏览(42)
  • Deep Learning-学习笔记

    deep learning训练过程 如果对所有层同时训练,时间复杂度会太高;如果每次训练一层,偏差就会逐层传递。这会面临跟上面监督学习中相反的问题,会严重欠拟合(因为深度网络的神经元和参数太多了)。 2006年,hinton提出了在非监督数据上建立多层神经网络的一个有效方法,

    2024年02月12日
    浏览(34)
  • The Deep Learning AI for Environmental Monitoring——Deep

    作者:禅与计算机程序设计艺术 环境监测是整个经济社会发展的一个重要环节,环境数据是影响经济、金融、社会和政策走向的不可或缺的组成部分。目前,环境监测主要依靠地面站(例如气象台)或者卫星遥感影像获取的数据进行实时监测,其精确度受到数据源和采集技术

    2024年02月08日
    浏览(42)
  • Tips for Deep Learning

    目录 Recipe of Deep Learning  Good Results on Training Data? New activation function Adaptive learning rate Good Results on Testing Data? Early Stopping Regularization Dropout 我们要做的第一件事是,提高model在training set上的正确率,然后要做的事是,提高model在testing set上的正确率。 这一部分主要讲述如何在

    2024年02月05日
    浏览(42)
  • 《Dive into Deep Learning》

    《Dive into Deep Learning》:https://d2l.ai/ Interactive deep learning book with code, math, and discussions Implemented with PyTorch, NumPy/MXNet, JAX, and TensorFlow Adopted at 500 universities from 70 countries 《动手学深度学习》中文版:https://zh.d2l.ai/chapter_preface/index.html 课程安排: https://courses.d2l.ai/zh-v2/

    2024年02月11日
    浏览(46)
  • 《Learning to Reweight Examples for Robust Deep Learning》笔记

    [1] 用 meta-learning 学样本权重,可用于 class imbalance、noisy label 场景。之前对其 (7) 式中 ϵ i , t = 0 epsilon_{i,t}=0 ϵ i , t ​ = 0 ( 对应 Algorithm 1 第 5 句、代码 ex_wts_a = tf.zeros([bsize_a], dtype=tf.float32) )不理解:如果 ϵ epsilon ϵ 已知是 0,那 (4) 式的加权 loss 不是恒为零吗?(5) 式不是

    2024年01月23日
    浏览(89)
  • 可信深度学习Trustworthy Deep Learning相关论文

    Survey An Overview of Catastrophic AI Risks. [paper] Connecting the Dots in Trustworthy Artificial Intelligence: From AI Principles, Ethics, and Key Requirements to Responsible AI Systems and Regulation. [paper] A Survey of Trustworthy Federated Learning with Perspectives on Security, Robustness, and Privacy. [paper] Adversarial Machine Learning: A Systemati

    2024年02月13日
    浏览(37)
  • AIGC实战——深度学习 (Deep Learning, DL)

    深度学习 ( Deep Learning , DL ) 是贯穿所有生成模型 ( Generative Model ) 的共同特征,几乎所有复杂的生成模型都以深度神经网络为核心,深度神经网络能够学习数据结构中的复杂关系,而不需要预先提取数据特征。在本节中,我们将介绍深度学习基本概念,并利用 Keras 构建深度神

    2024年02月08日
    浏览(41)
  • Modeling Deep Learning Accelerator Enabled GPUs

    Modeling Deep Learning Accelerator Enabled GPUs 发表在 ISPASS 2019 上。文章研究了 NVIDIA 的 Volta 和 Turing 架构中张量核的设计,并提出了 Volta 中张量核的架构模型。 基于 GPGPU-Sim 实现该模型,并且支持 CUTLASS 运行。发现其性能与硬件非常吻合,与 Titan V GPU 相比,获得了99.6%的 IPC 相关性。

    2024年02月08日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包