程序段

#ifdef,#else,#endif,#if用法详解(转)

我的梦境 提交于 2020-01-09 21:39:20
预处理就是在进行编译的第一遍词法扫描和语法分析之前所作的工作。说白了,就是对源文件进行编译前,先对预处理部分进行处理,然后对处理后的代码进行编译。这样做的好处是,经过处理后的代码,将会变的很精短。 关于预处理命令中的文件包含(#i nclude),宏定义(#define),书上已经有了详细的说明,在这里就不详述了。这里主要是对条件编译(#ifdef,#else,#endif,#if等)进行说明。以下分3种情况: 1:情况1: #ifdef _XXXX ...程序段1... #else ...程序段2... #endif 这表明如果标识符_XXXX已被#define命令定义过则对程序段1进行编译;否则对程序段2进行编译。 例: #define NUM ............. ............. ............. #ifdef NUM printf("之前NUM有过定义啦!:) \n"); #else printf("之前NUM没有过定义!:( \n"); #endif } 如果程序开头有#define NUM这行,即NUM有定义,碰到下面#ifdef NUM的时候,当然执行第一个printf。否则第二个printf将被执行。 我认为,用这种,可以很方便的开启/关闭整个程序的某项特定功能。 2:情况2: #ifndef _XXXX ...程序段1... #else

#ifndef #define #endif的作用

做~自己de王妃 提交于 2020-01-04 19:09:42
#ifndef x //先测试x是否被宏定义过 #define x 程序段1blabla~ //如果x没有被宏定义过,定义x,并编译程序段 1 #endif   程序段2blabla~   //如果x已经定义过了则编译程序段2的语句,“忽视”程序段 1#ifndef 和 #endif 要一起使用,如果丢失#endif,可能会报错。总结一下:在c语言中,对同一个变量或者函数进行多次声明是不会报错的。所以如果h文件里只是进行了声明工作,即使不使用# ifndef宏定义,一个c文件多次包含同一个h文件也不会报错。 使用#ifndef可以避免下面这种错误:如果在h文件中定义了全局变量,一个c文件包含同一个h文件多次,如果不加#ifndef宏定义,会出现变量重复定义的错误;如果加了#ifndef,则不会出现这种错. 来源: https://www.cnblogs.com/DuhuiliBlog/p/10239180.html

应届生经典面试题:说说进程与线程的区别与联系

守給你的承諾、 提交于 2020-01-04 04:50:31
转载:http://www.cnblogs.com/way_testlife/archive/2011/04/16/2018312.html 应届生经典面试题:说说进程与线程的区别与联系 这问题,估计计算机专业的同学在找研发等工作的时候都会遇到过。前几天某老牌软件厂商的电话面试就提到了这一经典问题,今天招聘会上又有不少同学说在面试的时候被问到这点。在这里我就起个头,大家有啥想法意见等都欢迎回帖交流。 要了解二者的区别与联系,首先得对进程与线程有一个宏观上的了解。 进程,是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竟争计算机系统资源的基本单位。每一个进程都有一个自己的地址空间,即进程空间或(虚空间)。进程空间的大小 只与处理机的位数有关,一个 16 位长处理机的进程空间大小为 216 ,而 32 位处理机的进程空间大小为 232 。进程至少有 5 种基本状态,它们是:初始态,执行态,等待状态,就绪状态,终止状态。 线程,在网络或多用户环境下,一个服务器通常需要接收大量且不确定数量用户的并发请求,为每一个请求都创建一个进程显然是行不通的,——无论是从系统资源开销方面或是响应用户请求的效率方面来看。因此,操作系统中线程的概念便被引进了。线程,是进程的一部分,一个没有线程的进程可以被看作是单线程的。线程有时又被称为轻权进程或轻量级进程,也是 CPU

shell function

匆匆过客 提交于 2019-12-26 11:07:55
function 功能 什么是『 函数 (function) 』功能啊?简单的说,其实, 函数可以在 shell script 当中做出一个类似自订运行命令的东西,最大的功能是, 可以简化我们很多的程序码~ function 的语法是这样的: function fname() { 程序段 } 那个 fname 就是我们的自订的运行命令名称~而程序段就是我们要他运行的内容了。 要注意的是, 因为 shell script 的运行方式是由上而下,由左而右, 因此在 shell script 当中的 function 的配置一定要在程序的最前面 , 这样才能够在运行时被找到可用的程序段喔! 好~我们将 sh12.sh 改写一下,自订一个名为 printit 的函数来使用喔: [root@www scripts]# vi sh12-2.sh #!/bin/bash # Program: # Use function to repeat information. # History: # 2005/08/29 VBird First release PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH function printit(){ echo -n "Your

c语言中的#ifndef、#def、#endif等宏是什么意思

萝らか妹 提交于 2019-12-24 12:12:57
#ifndef、(或者#ifndef)、#def、#endif等宏这几个宏是为了进行条件编译。一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。 条件编译命令最常见的形式为: #ifdef 标识符 程序段1 #else 程序段2 #endif 它的作用是:当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2。 其中#else部分也可以没有,即: #ifdef 程序段1 #denif 这里的“程序段”可以是语句组,也可以是命令行。这种条件编译可以提高C源程序的通用性。如果一个C源程序在不同计算机系统上系统上运行,而不同的计算机又有一定的差异。例如,我们有一个数据类型,在Windows平台中,应该使用long类型表示,而在其他平台应该使用float表示,这样往往需要对源程序作必要的修改,这就降低了程序的通用性。可以用以下的条件编译: #ifdef WINDOWS #define MYTYPE long #else #define MYTYPE float #endif 如果在Windows上编译程序,则可以在程序的开始加上 #define WINDOWS

c语言中ifndef和endif的用法

人盡茶涼 提交于 2019-12-24 10:52:34
#ifndef x //if not define的简写    #define x   ...  #endif   这是 宏 定义的一种,它可以根据是否已经定义了一个 变量 来进行分支选择,一般用于调试等等.实际上确切的说这应该是预处理功能中三种(宏定义,文件包含和 条件编译 )中的一种----条件编译。 C语言在对程序进行编译时,会先根据 预处理命令 进行“预处理”。C语言 编译系统 包括预处理,编译和链接等部分。    #ifndef x //先测试x是否被宏定义过    #define x   程序段1 //如果x没有被宏定义过,定义x,并 编译程序 段1    #endif   程序段2 //如果x已经定义过了则编译程序段2的语句,“忽视”程序段1。   条件指示符#ifndef 的最主要目的是防止 头文件 的重复包含和编译。了解:条件编译当然也可以用条件语句来实现。 但是用条件语句将会对整个 源程序 进行编译,生成的 目标代码 程序很长,而采用条件编译,则根据条件只编译其中的 程序段 1或程序段2,生成的 目标程序 较短。如果条件选择的程序段很长,采用条件编译的方法是十分必要的。   #ifndef 标示1 //判断"标示1"是否定义,如果被定义则返回假,如果没有被定义则返回真。      语句1 #ifndef 标示1   语句2 #define 标示1   语句3

STM32之系统滴答定时器

拥有回忆 提交于 2019-12-21 04:09:19
一、SysTick(系统滴答定时器)概述   操作系统需要一个滴答定时器周期性产生中断,以产生系统运行的节拍。在中断服务程序里,基于优先级调度的操作系统会根据进程优先级切换任务,基于时间片轮转系统会根据时间片切换任务。总之,滴答定时器是一个操作系统的“心跳”。   Cortex-M3在内核部分封装了一个滴答定时器--SysTick,在之前的ARM内核通常是不会把定时器做进内核,定时器都是SOC厂商自己制作的外设。显然,Cortex-M3封装了这么一个定时器,对于将操作系统移植到不同SOC厂商生产的Cortex-M3系类MCU上,带来了极大的方便。Cortex-M3内核统一了这样的一个系统滴答定时器,移植操作系统的时候可以使用内核的定时器,而忽略掉不同厂商生产定时器带来的分歧。 二、SysTick control and status register(STK_CTRL)   SysTick的控制是极其简单的,它的控制和状态都汇聚在同一个寄存器STK_CTRL上。   STK_CTRL的每一位的含义英文解释都是很清晰的,不必多说。需要额外讨论的是COUNTFLAG标志位,这个标志位代表的含义是:当计数为0时,也即STK_VAL计数至0时,此标志位置1。   经过笔者一番摸索,对此位有更多的看法。 COUNTFLAG:    1、此位与SysTick的中断无关,不是中断标志位

汇编四(习题)

浪子不回头ぞ 提交于 2019-12-05 10:05:22
程序设计题( 30分) 1. 编写 一个 程序段,将 AX寄存器低5位与BX寄存器低11位拼接为一个字,结果送至AX寄存器(10分)。 ;1. 编写一个程序段, ;将AX寄存器低5位与BX寄存器低11位拼接为一个字,结果送至AX寄存器(10分)。 assume cs:codes; codes segment start: mov ax,1234h; mov bx,1234h; ROR ax,1; ROL ax,1 源操作数 不知道为什么只能为1 ROR 不能实现ROR ax,5 简化代码 ROR ax,1; ROR ax,1; ROR ax,1; ROR ax,1; and ax,0F800h; and bx,07FFh; add ax,bx; hlt codes ends end start; 2.假设寄存器AX保存的是一个有符号数,编写一个程序段实现求AX的绝对值,即(10分)。 ;寄存器AX保存的是一个有符号数,编写一个程序段实现求AX的绝对值, datas segment x dw 5; y dw -5; z dw ?; datas ends assume cs:codes,ds:datas codes segment start: mov ax,datas; mov ds,ax; mov ax,y; cmp ax,'0' jGE let1 mov bx,0000h;

算法第四章上机实践报告

倾然丶 夕夏残阳落幕 提交于 2019-12-04 18:40:24
一. 实践题目 程序存储问题 设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是 li,1≤i≤n。 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序。 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。 输入格式: 第一行是2 个正整数,分别表示文件个数n和磁带的长度L。接下来的1行中,有n个正整数,表示程序存放在磁带上的长度。 输出格式: 输出最多可以存储的程序数。 输入样例: 在这里给出一组输入。例如: 6 50 2 3 13 8 80 20 输出样例: 在这里给出相应的输出。例如: 5二. 问题描述有一段磁带能存储一定长度的程序,用户给出磁带容量和待装程序段数和各程序段长度,要求设计一段程序通过最优策略计算改磁带能装最大容量程序段。三. 算法描述 #include<iostream> #include<algorithm> using namespace std; int main(){ int n,max; cin>>n>>max; int l[n]; for(int i = 0;i<n;i++){ cin>>l[i]; } sort(l,l+n); int count=0; int temp=max; int i = 0; while(i<n && temp>0){

if的用法

房东的猫 提交于 2019-12-02 06:28:58
今天在看程序的时候看到了一个关于#if 的用法,eg: #if(表达式) … #endif 通过查阅知道它是一种编译预处理命令,然后看了下它的常用方法,觉得很实用就记录了下来 1. #if 表达式 + 程序段 + #endif 形式 #if 表达式 程序段1 #else 程序段2 #endif 表示:如果表达式为真,则编译程序段1,否则编译程序段2. 2. #ifdef标示符 + 标识符 + #endif 形式 表示:如果标示符已经被#define命令定义过,则编译程序段。 eg: #define a 100 此时,我们要检查a是否定义(假设我们已经记不着这点了),或者我们要给a一个不同的值,就加入如下句子 #if defined a #undef a #define a 200 #endif 上述语句检验a是否被定义,如果被定义,则用#undef语句解除定义,并重新定义a为200 3. #if 0/ #if 1 + #endif 形式 首先这里的0和1可以当做普通表达式来看待,1为真,0为假。 其次使用#if 0 有个很实用的方法就是当做注释来用。 有时候比用 // 和 / … / 整洁美观 比如用在调试代码的时候,code中定义的是一些调试版本的代码,此时code完全被编译器忽略。如果想让code生效,只需把#if 0改成#if 1 eg: #include int main