CC++指令 #undef ,#ifdef, #ifndef,#if的用法

CC++指令 #undef ,#ifdef, #ifndef,#if的用法
CC++指令 #undef ,#ifdef, #ifndef,#if的用法

C/C++指令#undef ,#ifdef, #ifndef,#if的用法

#ifdef,#ifndef使用

条件编译命令最常见的形式为:

#ifdef 标识符

程序段1

#else

程序段2

#endif

它的作用是:当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2。

其中#else部分也可以没有,即:

#ifdef

程序段1

#denif

这里的“程序段”可以是语句组,也可以是命令行。这种条件编译可以提高C源程序的通用性。如果一个C源程序在不同计算机系统上系统上运行,而不同的计算机又有一定的差异。例如,当程式跑到else,如果TRACE没被定义,则下一句再定义

源代码:

#define TRACE(x)

#if DBG

#undef TRACE

#define TRACE(x) g_TraceCallback x

#else

#ifndef TRACE

#define TRACE(x)

#endif

#endif

解析:

#define TRACE(x)

#if DBG

#undef TRACE

#define TRACE(x) g_TraceCallback x

#else

#ifndef TRACE //如果之前没定义,则跑下边定义------该例前边有#define TRACE(x) ,则后边的定义自动失效因此不会因为重复定义而出错

#define TRACE(x) //定义

#endif

#endif

我们有时也采用下面的形式:

#ifndef 标识符

程序段1

#else

程序段2

#endif

只是第一行与第一种形式不同:将“ifdef”改为“ifndef”。它的作用是:若标识符未被定义则编译程序段1,否则编译程序段2。这种形式与第一种形式的作用相反。

以上两种形式用法差不多,根据需要任选一种,视方便而定。

还有一种形式,就是#if后面的是一个表达式,而不是一个简单的标识符:

#if 表达式

程序段1

#else

程序段2

#endif

当表达式成立,则跑程序段1,否则跑程序段2

注意:

除#undef释放之前的宏定义可单独使用之外,

#ifdef,#if,#ifndef均要与#endif配对

如:

#if...#else...#endif

#ifdef...#endif

#ifndef...#endif

以下转自:https://www.360docs.net/doc/6e14970753.html,/bigpretty/article/details/5018261

一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件

编译”。有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。

条件编译命令最常见的形式为:

/////////

#ifdef 标识符

程序段1

#else

程序段2

#endif

它的作用是:当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2。

其中#else部分也可以没有,即:

#ifdef

程序段1

#denif

在头文件中使用#ifdef和#ifndef是非常重要的,可以防止双重定义的错误。如你在头文件aaa.h中定义了一个类aaa如下:

class aaa

{

};

如果两次#include "aaa.h"(不见得是直接,也有可能两个不同的头文件中都包含了这个头文件)就会出错,因为相同的类不能定义两次。把aaa.h稍做修改:

#ifndef _aaa_

#define _aaa_

class aaa

{

};

#endif

就可以避免这样的问题。因为当你已经包含过这个文件,_aaa_就会有了定义,那么#ifndef 的条件为假,就不会再执行后面的类定义了。

#ifdef和#endif必须成对使用。

从理论上讲可以出现在任何地方(头文件和实现文件中)

通常为了防止头文件被多次包含,在头文件中使用是必须的:

如:#ifndef MY_HEAD_H //头文件开头,名字是任意的,注意不要和其它头文件冲突头文件声明

#endif //头文件结尾

有时候,在b.h中会include "a.h"

在"c.h"中会include "b.h"及include"a.h",

这时,如果不用ifndef/endif,就会包含两次a.h,产生错误。

条件编译,满足条件就编译,否则就不编译,如果有一段代码有时候你想要,有时候又不想编译(比如为了调试),可以这样写:

#if 1(0)

xxxxxx

xxxxxx

#endif

需要的时候写1,不要的时候改为0就可以了

文件中的#ifndef

头件的中的#ifndef,这是一个很关键的东西。比如你有两个C文件,这两个C文件都include 了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。

还是把头文件的内容都放在#ifndef和#endif中吧。不管你的头文件会不会被多个文件引用,你都要加上这个。一般格式是这样的:

#ifndef <标识>

#define <标识>

......

......

#endif

<标识>在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:stdio.h

#ifndef _STDIO_H_

#define _STDIO_H_

......

#endif

2.在#ifndef中定义变量出现的问题(一般不定义在#ifndef中)。

#ifndef AAA

#define AAA

...

int i;

...

#endif

里面有一个变量定义

在vc中链接时就出现了i重复定义的错误,而在c中成功编译。

结论:

(1).当你第一个使用这个头的.cpp文件生成.obj的时候,int i 在里面定义了当另外一个使用这个的.cpp再次[单独]生成.obj的时候,int i 又被定义然后两个obj被另外一个.cpp也include 这个头的,连接在一起,就会出现重复定义.

(2).把源程序文件扩展名改成.c后,VC按照C语言的语法对源程序进行编译,而不是C++。在C语言中,若是遇到多个int i,则自动认为其中一个是定义,其他的是声明。

(3).C语言和C++语言连接结果不同,可能(猜测)时在进行编译的时候,C++语言将全局变量默认为强符号,所以连接出错。C语言则依照是否初始化进行强弱的判断的。(参考)

解决方法:

(1).把源程序文件扩展名改成.c。

(2).推荐解决方案:

.h中只声明extern int i;在.cpp中定义

#ifndef __X_H__

#define __X_H__

extern int i;

#endif //__X_H__

int i;

注意问题:变量一般不要定义在.h文件中。

#ifdef的用法

#ifdef的用法 头件的中的#ifndef,这是一个很关键的东西。比如你有两个C文件,这两个C文件都include 了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。 还是把头文件的内容都放在#ifndef和#endif中吧。不管你的头文件会不会被多个文件引用,你都要加上这个。一般格式是这样的: #ifndef <标识> #define <标识> ...... ...... #endif <标识>在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:stdio.h #ifndef _STDIO_H_ #define _STDIO_H_ ...... #endif (2) 灵活使用#ifdef指示符,我们可以区隔一些与特定头文件、程序库和其他文件版本有关的代码。 代码举例:新建define.cpp文件 #include "iostream.h" int main() { #ifdef DEBUG cout<< "Beginning execution of main()"; #endif return 0; } 运行结果为:Press any key to continue 改写代码如下: #include "iostream.h" #define DEBUG int main() {

#ifdef DEBUG cout<< "Beginning execution of main()"; #endif return 0; } 运行结果为:Beginning execution of main() Press any key to continue 更一般的情况是,#define语句是包含在一个特定的头文件中。 比如,新建头文件head.h,在文件中加入代码: #ifndef DEBUG #define DEBUG #endif 而在define.cpp源文件中,代码修改如下: #include "iostream.h" #include "head.h" int main(){ #ifdef DEBUG cout<< "Beginning execution of main()"; #endif return 0; } 运行结果如下:Beginning execution of main() Press any key to continue 结论:通过使用#ifdef指示符,我们可以区隔一些与特定头文件、程序库和其他文件版本有关的代码。 (3) 如果你的程序由几个文件组成,而且有两个以上的文件都要包含同一个文件,为了避免重复包含同一个文件,所以在要被包含多次的文件中用#ifdef。 #ifdef 就是说if define,(如果定义了) 就像if else语句一样 /*试举一个例子: 如果想编写一个既可用TC 编译又可用VC 编译的程序,但不同的编译器生成的可执行文件的功能不同时, #ifdef 就有用了. 下面这个程序,如果用VC 编译,只会显示一句话; 但若用TC 编译,既显示一句话,又把背景颜色改为蓝色。 这样做的原因是VC 没有textbackground() 这个函数, 为了不改变源程序而适应不同的编译器, 这种条件编译(conditional compilation)的方法比较有用. 另外,有些Windows API 对操作系统的版本有要求,这时条件编译又可派上用场了. */

bat命令大全 清理系统垃圾更简单

1.Echo 命令 打开回显或关闭请求回显功能,或显示消息。如果没有任何参数,echo 命令将显示当前回显设置。 语法 echo [{on|off}] [message] Sample:echo off / echo hello world 在实际应用中我们会把这条命令和重定向符号(也称为管道符号,一般用> >> ^)结合来实现输入一些命令到特定格式的文件中.这将在以后的例子中体现出来。 2.@ 命令 表示不显示@后面的命令,在入侵过程中(例如使用批处理来格式化敌人的硬盘)自然不能让对方看到你使用的命令啦。 Sample:@echo off @echo Now initializing the program,please wait a minite... @format X: /q/u/autoset (format 这个命令是不可以使用/y这个参数的,可喜的是微软留了个autoset这个参数给我们,效果和/y是一样的。) 3.Goto 命令 指定跳转到标签,找到标签后,程序将处理从下一行开始的命令。 语法:goto label (label是参数,指定所要转向的批处理程序中的行。) Sample: if {%1}=={} goto noparms if {%2}=={} goto noparms(如果这里的if、%1、%2你不明白的话,先跳过去,后面会有详细的解释。) @Rem check parameters if null show usage :noparms echo Usage: monitor.bat ServerIP PortNumber goto end 标签的名字可以随便起,但是最好是有意义的字母啦,字母前加个:用来表示这个字母是标签,goto命令就是根据这个:来寻找下一步跳到到那里。最好有一些说明这样你别人看起来才会理解你的意图啊。 4.Rem 命令 注释命令,在C语言中相当与/*--------*/,它并不会被执行,只是起一个注释的作用,便于别人阅读和你自己日后修改。 Rem Message Sample:@Rem Here is the description. 5.Pause 命令 运行Pause 命令时,将显示下面的消息: Press any key to continue . . . Sample: @echo off

linux 基本操作命令行

linux的命令操作 1、日常操作命令 **查看当前所在的工作目录 pwd **查看当前系统的时间 date **查看有谁在线(哪些人登陆到了服务器) who 查看当前在线 last 查看最近的登陆历史记录 2、文件系统操作 ** ls / 查看根目录下的子节点(文件夹和文件)信息 ls -al -a是显示隐藏文件 -l是以更详细的列表形式显示 **切换目录 cd /home **创建文件夹 mkdir aaa 这是相对路径的写法 mkdir -p aaa/bbb/ccc mkdir /data 这是绝对路径的写法 **删除文件夹 rmdir 可以删除空目录 rm -r aaa 可以把aaa整个文件夹及其中的所有子节点全部删除 rm -rf aaa 强制删除aaa **修改文件夹名称 mv aaa angelababy **创建文件 touch somefile.1 创建一个空文件 echo "i miss you,my baby" > somefile.2 利用重定向“>”的功能,将一条指令的输出结果写入到一个文件中,会覆盖原文件内容 echo "huangxiaoming ,gun dan" >> somefile.2 将一条指令的输出结果追加到一个文件中,不会覆盖原文件内容 用vi文本编辑器来编辑生成文件 ******最基本用法 vi somefile.4

1、首先会进入“一般模式”,此模式只接受各种快捷键,不能编辑文件内容 2、按i键,就会从一般模式进入编辑模式,此模式下,敲入的都是文件内容 3、编辑完成之后,按Esc键退出编辑模式,回到一般模式; 4、再按:,进入“底行命令模式”,输入wq命令,回车即可 ******一些常用快捷键 一些有用的快捷键(在一般模式下使用): a 在光标后一位开始插入 A 在该行的最后插入 I 在该行的最前面插入 gg 直接跳到文件的首行 G 直接跳到文件的末行 dd 删除行,如果 5dd ,则一次性删除光标后的5行 yy 复制当前行, 复制多行,则 3yy,则复制当前行附近的3行 p 粘贴 v 进入字符选择模式,选择完成后,按y复制,按p粘贴 ctrl+v 进入块选择模式,选择完成后,按y复制,按p粘贴 shift+v 进入行选择模式,选择完成后,按y复制,按p粘贴 查找并替换(在底行命令模式中输入) %s/sad/88888888888888 效果:查找文件中所有sad,替换为88888888888888 /you 效果:查找文件中出现的you,并定位到第一个找到的地方,按n可以定位到下一个匹配位置(按N定位到上一个) 3、文件权限的操作 ****linux文件权限的描述格式解读 drwxr-xr-x (也可以用二进制表示 111 101 101 --> 755) d:标识节点类型(d:文件夹 -:文件 l:链接) r:可读 w:可写 x:可执行 第一组rwx:表示这个文件的拥有者对它的权限:可读可写可执行 第二组r-x:表示这个文件的所属组对它的权限:可读,不可写,可执行 第三组r-x:表示这个文件的其他用户(相对于上面两类用户)对它的权限:可读,不可写,可执行 ****修改文件权限 chmod g-rw haha.dat 表示将haha.dat对所属组的rw权限取消 chmod o-rw haha.dat 表示将haha.dat对其他人的rw权限取消 chmod u+x haha.dat 表示将haha.dat对所属用户的权限增加x 也可以用数字的方式来修改权限 chmod 664 haha.dat 就会修改成 rw-rw-r--

C++头文件防止重复定义的用法总结

许多头文件中都有#ifndef XXX_H #define XXX_H #endif XXX_H.请问我什么要这么定义?XXX_H有是什么东西? rt. 据我所知是为了防止重复定义.好比一个 .h ,可能会在好几 个 .cpp 中被 include 进来. 这样就会产生重复定义.这样就能解决这个问题啦. 这样主要是为了避免重复编译头文件。 一般是这样的形式 #ifndef XXXXX_H // 如果没有定义 XXXXX_H #defined XXXXX_H // 先定义 XXXXX_H,那么下一次编译到这个头文件的时候上一句条件不成立,下面的内容就不会再编译了。 // 头文件中的代码 #endif 在 C++ 中,可以用 #pragma once 来代替 即使用了 #pragma once 之后就可以不用那么麻烦去判断有没有编译过这个头文件了,那个由编译器自己判断了。 请问楼上的: 1,#pragma once怎么用啊? 2,如果我写一个类。myString.h 其中实现在myString.cpp中,请问:我应该把 #ifndef XXXXX_H #defined XXXXX_H #endif 写在myString.h myString.cpp的那个文件中呢? #pragma once 直接放在文件开始的地方就可以了 放在myString.h中

防止重复定义 写在myString.h的开头 也就是判断myString.h里那个类定义了没 已经定义的话就跳过#defined 直接#endif 可以看看msdn里面的说法... #ifndef ABC_H #define ABC_H ...................... #endif 条件指示符#ifndef检查ABC_H在前面是否已经被定义这里ABC_H是一个预编译器常量. 习惯上预编译器常量往往被写成大写字母.如果ABC_H在前面没有被定义则条件指示符的值为真 于是从#ifndef 到#endif 之间的所有语句都被包含进来进行处理相反如果#ifndef 指示符的值为假 则它与#endif 指示符之间的行将被忽略. 为了保证头文件只被处理一次, 把如下#define 指示符 #define ABC_H 放在#ifndef后面这样在头文件的内容第一次被处理时ABC_H将被定义 从而防止了在程序文本文件中以后#ifndef 指示符的值为真. 只要不存在两个必须包含的头文件要检查一个同名的预处理器常量这样的情形这 个策略就能够很好地运作. 可参考《C程序设计语言(K&R)》,《C++程序设计语言 (B_S)》,《C++ Primer(Lippman)》 是为了防止重复定义. 主要是用来解决重复定义的问题,在C++中函数和变量之类的只能被定义一次. #pragma once window的东西不公用

Linux 用户必知:一分钟掌握14个常用Linux命令行快捷键

Linux 用户必知:一分钟掌握14个常用Linux命令行快捷键 2018.10.29 前几天有个朋友给我发消息:“问你个问题,Linux 命令行有没有快捷键一下从行末会到行头?经常敲了很多命令发现忘加sudo 了,然后把命令删了重新敲一遍”。 正好借此机会给不知道的朋友总结一下: 首先说说历史记录个数的“HISTFILESIZE”和“HISTSIZE”的区别默认情况下HISTFILESIZE 和HISTSIZE的值都是500,表示可以记录500 条命令记录。 ·HISTFILESIZE 表示记录在文件中的命令条数 · HISTSIZE 表示记录在内存中的命令条数 当我们在 shell 命令行执行命令的时候,最近的HISTSIZE 条命令被保存在内存当中可以使用上下光标或者ctrl+p,ctrl+n 上下查找命令。 当退出shell 时HISTFILESIZE 条命令被保存到历史命令文件中,下次登录shell 时会从历史命令文件中读取命令道内存历史命令道中。 当网络中断等异常时,你会发现之前的历史命令,下次登录时用上下光标找不到上次的历史命令,所以要正常退出或者发送探测包保持shell 在线。 如果想增加历史命令保存的数量,可以在~/.bash_profile 中手动修改HISTFILESIZE 和HISTSIZE 这两个变量的值。 必须知道的Linux命令行 我想提一下一些快捷键可能依赖于你使用的Shell。Bash 是最受欢迎的shell,所以列出的快捷键集中在Bash。如果你愿意,你也可以称其为Bash 快捷键列表。 注意我在键盘快捷键中使用了大写字母,但这并不意味着你在使用快捷键时必须按下

at命令使用详解 定时运行bat文件(批处理)

原文地址:at命令使用详解定时运行bat文件(批处理)作者:changwanghao AT命令是Windows XP中内置的命令,它也可以媲美Windows中的“计划任务”,而且在计划的安排、任务的管理、工作事务的处理方面,AT命令具有更强大更神通的功能。AT命令可在指定时间和日期、在指定计算机上运行命令和程序。我们可以在“开始→运行”中输入AT命令,下面就来看看AT命令的一些实例分析。 1、定时关机命令:at 21:00 ShutDown –S –T30 该命令运行后,到了21:00点,电脑会出现“系统关机”对话框,并默认30秒延时自动关机。 2、定时提醒命令:at 12:00 Net Send 10.10.36 .122与朋友约会的时间到了,快点准备出发吧! 其中Net Send是Windows内部程序,可以发送消息到网络上的其他用户、计算机。10.10.36.122是本机电脑的IP地址。这个功能在Windows中也称作“信使服务”。 3、自动运行批处理文件如果公司的数据佷重要,要求在指定的日期/时间进行备份,那么运行:命令:at 1:00AM /Every:Saturday My_BackUp.bat 这样,在每个Saturday(周六)的早上1:00点,电脑定时启动My_BackUp.bat批处理文件。My_BackUp.bat是一个你自行编制的批处理文件,它包含能对系统进行数据完全备份的多条命令。 4、取消已经安排的计划命令:at 5 /Delete 有时候,你已经安排好的计划可能临时变动,这样你可以及时地用上述命令删除该计划(5为指派给已计划命令的标识编号),当然,删除该计划后,可以重新安排。 AT命令是一个win2000/xp/nt当中的一个命令,然而在我们的入侵当中是一个不可缺少的一项服务,他可以让程序中有一个程序在一定的时间里自动执行,从而操控计算机, 下面说一下他的用法! AT 命令安排在特 定日期和时间运行命令和程序。要使用 AT 命令,计划服务必须已在运行中。 AT [\computername] [ [id] [/DELETE] | /DELETE [/YES]] AT [\computername] time [/INTERACTIVE] [ /EVERY:date[,...] | /NEXT:date[,...]] "command" \computername指定远程计算机。如果 省略这个参数,会计划在本地计算机上运行命令。 id指定给已计划命令的识别号。 /delete 删除某个已计划的命令。如果省略 id,计算机上所有已计划的命令都会被删除。 /yes不需要进一步确 认时,跟删除所有作业的命令一起使用。 time 指定运行命令的时间。 /interactive允许作业在运行时,与当时登录的用户桌面进行交互。 /every:date[,...]每个月或每个星期在指定的日期运行命 令。如果省略日期,则默认为在每月的本日运 行。 /next:date[,...]指定在下一个指定日期(如,下周四)运 行命令。如果省略日期,则默认为在每月的本日运行。 "command"准备运行的 Windows NT 命令或批处理 程序。下面说一下他的几个用法!! (Viliosn.exe 是一个程序) 1,如果想让启动对方在指定时间里的某个程序,你可在命令行里打入: At \127.0.0.123:00 c:winntsystem32/viliosn.exe 提示:新加了一份作业, 作业id=1 2.让对方的计算机在每周一和周二的23:00启动某个程序.那么你可以打入 At \127.0.0.1 23:00 /every:一,二 c:winntsystem32viliosn.exe 提示:新加了一份作业, 作业id=2 3.删除对方计算机上作业id为1的任务 At

c语言预处理命令之条件编译(ifdefelseendifif等)

C语言预处理命令之条件编译(#ifdef,#else,#endif,#if等) 预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。可见预处理过程先于编译器对源代码进行处理。 在C语言中,并没有任何内在的机制来完成如下一些功能:在编译时包含其他源文件、定义宏、根据条件决定编译时是否包含某些代码。要完成这些工作,就需要使用预处理程序。尽管在目前绝大多数编译器都包含了预处理程序,但通常认为它们是独立于编译器的。预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行响应的转换。预处理过程还会删除程序中的注释和多余的空白字符。 预处理指令是以#号开头的代码行。#号必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。下面是部分预处理指令: 指令用途 #空指令,无任何效果 #include包含一个源代码文件 #define定义宏 #undef取消已定义的宏 #if如果给定条件为真,则编译下面代码 #ifdef如果宏已经定义,则编译下面代码 #ifndef如果宏没有定义,则编译下面代码 #elif如果前面的#if给定条件不为真,当前条件为真,则编译下面代码 #endif结束一个#if……#else条件编译块 #error停止编译并显示错误信息 一、文件包含 #include预处理指令的作用是在指令处展开被包含的文件。包含可以是多重的,也就是说一个被包含的文件中还可以包含其他文件。标准C编译器至少支持八重嵌套包含。

预处理过程不检查在转换单元中是否已经包含了某个文件并阻止对它的多次包含。这样就可以在多次包含同一个头文件时,通过给定编译时的条件来达到不同的效果。例如: #defineAAA #include"t.c" #undefAAA #include"t.c" 为了避免那些只能包含一次的头文件被多次包含,可以在头文件中用编译时条件来进行控制。例如: /*my.h*/ #ifndefMY_H #defineMY_H …… #endif 在程序中包含头文件有两种格式: #include #include"my.h" 第一种方法是用尖括号把头文件括起来。这种格式告诉预处理程序在编译器自带的或外部库的头文件中搜索被包含的头文件。第二种方法是用双引号把头文件括起来。这种格式告诉预处理程序在当前被编译的应用程序的源代码文件中搜索被包含的头文件,如果找不到,再搜索编译器自带的头文件。 采用两种不同包含格式的理由在于,编译器是安装在公共子目录下的,而被编译的应用程序是在它们自己的私有子目录下的。一个应用程序既包含编译器提供的公共头文件,也包含自定义的私有头文件。采用两种不同的包含格式使得编译器能够在很多头文件中区别出一组公共的头文件。

批处理命令For循环命令详解

分类:2010-06-11 13:0416793人阅读(0) 批处理for命令详解 FOR这条命令基本上都被用来处理文本,但还有其他一些好用的功能! 看看他的基本格式(这里我引用的是批处理中的格式,直接在命令行只需要一个%号) FOR 参数%%变量名IN (相关文件或命令) DO 执行的命令 参数:FOR有4个参数/d /l /r /f 他们的作用我在下面用例子解释 %%变量名:这个变量名可以是小写a-z或者大写A-Z,他们区分大小写,FOR会把每个读取到的值给他; IN:命令的格式,照写就是了; (相关文件或命令) :FOR要把什么东西读取然后赋值给变量,看下面的例子 do:命令的格式,照写就是了! 执行的命令:对每个变量的值要执行什么操作就写在这. 可以在CMD输入for /看系统提供的帮助!对照一下 FOR %%variable IN (set) DO command [command-parameters] %%variable 指定一个单一字母可替换的参数。 (set) 指定一个或一组文件。可以使用通配符。 command 指定对每个文件执行的命令。 command-parameters 为特定命令指定参数或命令行开关。 现在开始讲每个参数的意思 /d 仅为目录 如果Set (也就是我上面写的"相关文件或命令") 包含通配符(* 和),将对与Set 相匹配的每个目 录(而不是指定目录中的文件组)执行指定的Command。 系统帮助的格式:FOR /D %%variable IN (set) DO command 他主要用于目录搜索,不会搜索文件,看这样的例子 @echo off for /d %%i in (*) do @echo %%i pause 把他保存放在C盘根目录执行,就会把C盘目录下的全部目录名字打印出来,而文件名字一个也不显示!

define用法以及

#define用法以及#define和typedef区别1.简单的define定义 #define MAXTIME 1000 2.define的“函数定义” define可以像函数那样接受一些参数,如下 #define max(x,y) (x)>(y)?(x):(y); 因为这个“函数”没有类型检查,就好像一个函数模板似的,没有模板那么安全就是了。 但是这样做的话存在隐患,例子如下: #define Add(a,b) a+b;如果遇到如:c * Add(a,b) * d的时候就会出现问题。 另外举一个例子: #define pin (int*); pin a,b; 本意是a和b都是int型指针,但是实际上变成int* a,b; a是int型指针,而b是int型变量。 这时应该使用typedef来代替define,这样a和b就都是int型指针了。 我们在定义的时候,养成一个良好的习惯,建议所有的层次都要加括号。 3.宏的单行定义(少见用法) #define A(x) T_##x #define B(x) #@x #define C(x) #x 我们假设:x=1,则有: A(1)------〉T_1 B(1)------〉'1' C(1)------〉"1" 4.define的多行定义 define可以替代多行的代码,例如MFC中的宏定义(非常的经典,虽然让人看了恶心)

#define MACRO(arg1, arg2) do { \ /* declarations */ \ stmt1; \ stmt2; \ /* ... */ \ } while(0) /* (no trailing ; ) */ 关键是要在每一个换行的时候加上一个"\" 5.在大规模的开发过程中,特别是跨平台和系统的软件里,define最重要的功能是条件编译。 就是: #ifdef WINDOWS ...... ...... #endif #ifdef LINUX ...... ...... #endif 可以在编译的时候通过#define设置编译环境。 6.如何定义宏、取消宏 #define [MacroName] [MacroValue] //定义宏 #undef [MacroName] //取消宏 #define PI (3.1415926) //普通宏 #define max(a,b) ((a)>(b)? (a),(b)) //带参数的宏 7.条件编译 #ifdef XXX…(#else) … #endif 例如 #ifdef DV22_AUX_INPUT #define AUX_MODE 3

Linux命令大全(设备管理)

设备管理-setleds 名称:setleds 使用权限:一般使用者 使用方式: setleds [-v] [-L] [-D] [-F] [{+|-}num] [{+|-}caps] [{+|-}scroll]说明: 用来设定键盘上方三个LED 的状态。在Linux 中,每一个虚拟主控台都有独立的设定。 参数: -F 预设的选项,设定虚拟主控台的状态。 -D 除了改变虚拟主控台的状态外,还改变预设的状态。 -L 不改变虚拟主控台的状态,但直接改变LED 显示的状态。这会使得LDE 显示和目前虚拟主控台的状态不符合。我们可以在稍后用-L 且不含其它选项的setleds 命令回复正常状态。 -num +num 将数字键打开或关闭。 -caps +caps 把大小写键打开或关闭。 -scroll +scroll 把选项键打开或关闭。 范例: 将数字键打开,其馀二个灯关闭。 # setleds +num -caps -scroll 设备管理-loadkeys 名称: loadkeys 使用权限: 所有使用者

使用方式: loadkeys [ -d --default ] [ -h --help ] [ -q --quiet ] [ -v --verbose [ -v --verbose ]...] [ -m --mktable ] [ -c --clearcompose ] [ -s --clearstrings ] [ filename... ] 使用说明: 这个命令可以根据一个键盘定义表改变linux 键盘驱动程序转译键盘输入过程。详细的说明请参考dumpkeys。 选项: -v --verbose 印出详细的资料,你可以重复以增加详细度。 -q --quiet 不要显示任何讯息。 -c --clearcompose 清除所有composite 定义。 -s --clearstrings 将定串定义表清除。 相关命令: dumpkeys 设备管理-rdev 名称:rdev 使用权限:所有使用者 使用方式:使用这个指令的基本方式是:rdev [-rsvh ] [-o offset ] [ image [value [ offset ] ] ] 但是随著使用者想要设定的参数的不同,底下的方式也是一样: rdev [ -o offset ] [ image [ root_device [ offset ] ] ] swapdev [ -o offset ] [ image [ swap_device [ offset ] ] ] ramsize [ -o offset ] [ image [ size [ offset ] ] ] videomode [ -o offset ] [ image [ mode [ offset ] ] ] rootflags [ -o offset ] [ image [ flags [ offset ] ] ]

批处理常用命令及用法大全_-__打印

注:如果对某一命令还不是很熟悉,可以在命令行窗口下输入:命令名/?的方式来获得帮助。 1 echo 和 @回显控制命令 @ #关闭单行回显 echo off #从下一行开始关闭回显 @echo off #从本行开始关闭回显。一般批处理第一行都是这个 echo on #从下一行开始打开回显 echo #显示当前是 echo off 状态还是 echo on 状态echo. #输出一个"回车换行",一般就是指空白行 echo hello world #输出hello world "关闭回显"是指运行批处理文件时,不显示文件里的每条命令,只显示运行结果批处理开始和结束时,系统都会自动打开回显 2 errorlevel程序返回码 echo %errorlevel%每个命令运行结束,可以用这个命令行格式查看返回码用于判断刚才的命令是否执行成功默认值为0,一般命令执行出错会设 errorlevel 为1 3 dir显示目录中的文件和子目录列表 dir #显示当前目录中的文件和子目录 dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件 dir c: /a:d #显示 C 盘当前目录中的目录 dir c:\ /a:-d #显示 C 盘根目录中的文件 dir d:\mp3 /b/p #逐屏显示 d:\mp3 目录里的文件,只显示文件名,不显示时间和大小 dir *.exe /s显示当前目录和子目录里所有的.exe文件其中 * 是通配符,代表所有的文件名,还一个通配符 ? 代表一个任意字母或汉字如 c*.* 代表以 c 开头的所有文件?.exe 代表所有文件名是一个字母的.exe文件如果指定的目录或文件不存在,将返回 errorlevel 为1;每个文件夹的 dir 输出都会有2个子目录 . 和 ... 代表当前目录.. 代表当前目录的上级目录 dir . #显示当前目录中的文件和子目录 dir .. #显示当前目录的上级目录中的文件和子目录 其它参数可参考 dir /? 4 cd更改当前目录 cd mp3 #进入当前目录中的mp3 目录 cd .. #进入当前目录中的上级目录 cd\ #进入根目录 cd #显示当前目录 cd /d d:\mp3 #可以同时更改盘符和目录 cd "Documents and Settings"\All users文件名带空格,路径前需要加上引号!!如果更改到的目录不存在,则出错返回 errorlevel=1 5 md创建目录 md abc #在当前目录里建立子目录 abc md d:\a\b\c #如果 d:\a 不存在,将会自动创建 6 rd删除目录 rd abc #删除当前目录里的 abc 子目录,要求为空目录 rd /s/q d:\temp #删除 d:\temp 文件夹及其子文件夹和文件,不需要按 Y 确认 7 del删除文件 del d:\test.txt #删除指定文件,不能是隐藏、系统、只读文件 del *.*删除当前目录里的所有文件,不包括隐藏、系统、只读文件,要求按 Y 确认 del /q/a/f d:\temp\*.*删除 d:\temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录 del /q/a/f/s d:\temp\*.*删除 d:\temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录 8 ren文件重命名 ren 1.txt 2.bak #把 1.txt 更名为 2.bak ren *.txt *.ini #把当前目录里所有.txt文件改成.ini文件 ren d:\temp tmp #支持对文件夹的重命名 9 cls清屏 10 type显示文件内容 type c:\boot.ini #显示指定文件的内容,程序文件一般会显示乱码 type *.txt #显示当前目录里所有.txt文件的内容 11 copy拷贝文件 XCOPY复制组文件 COPY复制文件 拷贝目录和文件——xcopy 在拷贝单个文件时,可以使用copy命令完成,但当我们要成批拷贝文件,甚至连同子目录一起拷贝时,就要用到xcopy。 copy c:\test.txt d:\复制 c:\test.txt 文件到 d:\ copy c:\test.txt d:\test.bak复制 c:\test.txt 文件到 d:\ ,并重命名为 test.bak copy c:\*.*复制 c:\ 所有文件到当前目录,不包括隐藏文件和系统文件不指定目标路径,则默认目标路径为当前目录 copy con test.txt从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件con代表屏幕,prn 代表打印机,nul代表空设备 copy 1.txt + 2.txt 3.txt合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件如果不指定 3.txt ,则保存到 1.txt 1

关于回调函数的几个例子(c)

以下是一个简单的例子。实现了一个repeat_three_times函数,可以把调用者传来的任何回调函数连续执行三次。 例 1. 回调函数 /* para_callback.h */ #ifndef PARA_CALLBACK_H #define PARA_CALLBACK_H typedef void (*callback_t)(void *); extern void repeat_three_times(callback_t, void *); #endif /* para_callback.c */ #include "para_callback.h" void repeat_three_times(callback_t f, void *para) { f(para); f(para); f(para); } /* main.c */ #include #include "para_callback.h" void say_hello(void *str) { printf("Hello %s\n", (const char *)str); } void count_numbers(void *num) { int i; for(i=1; i<=(int)num; i++) printf("%d ", i); putchar('\n');

} int main(void) { repeat_three_times(say_hello, "Guys"); repeat_three_times(count_numbers, (void *)4); return 0; } 回顾一下前面几节的例子,参数类型都是由实现者规定的。而本例中回调函数的参数按什么类型解释由调用者规定,对于实现者来说就是一个void *指针,实现者只负责将这个指针转交给回调函数,而不关心它到底指向什么数据类型。调用者知道自己传的参数是char *型的,那么在自己提供的回调函数中就应该知道参数要转换成char *型来解释。 回调函数的一个典型应用就是实现类似C++的泛型算法(Generics Algorithm)。下面实现的max函数可以在任意一组对象中找出最大值,可以是一组int、一组char或者一组结构体,但是实现者并不知道怎样去比较两个对象的大小,调用者需要提供一个做比较操作的回调函数。 例 2. 泛型算法 /* generics.h */ #ifndef GENERICS_H #define GENERICS_H typedef int (*cmp_t)(void *, void *); extern void *max(void *data[], int num, cmp_t cmp); #endif /* generics.c */ #include "generics.h" void *max(void *data[], int num, cmp_t cmp) { int i; void *temp = data[0];

BAT(批处理)文件编写详细手册

BAT(批处理)文件编写详细手册 一、批处理文件简介 首先,批处理文件是一个文本文件,这个文件的每一行都是一条DOS命令(大部分时候就好象我们在DOS提示符下执行的命令行一样),你可以使用DOS下的Edit或者Windows的记事本(notepad)等任何文本文件编辑工具创建和修改批处理文件。 其次,批处理文件是一种简单的程序,可以通过条件语句(if)和流程控制语句(goto)来控制命令运行的流程,在批处理中也可以使用循环语句 (for)来循环执行一条命令。当然,批处理文件的编程能力与C语言等编程语句比起来是十分有限的,也是十分不规范的。批处理的程序语句就是一条条的 DOS命令(包括内部命令和外部命令),而批处理的能力主要取决于你所使用的命令。 第三,每个编写好的批处理文件都相当于一个DOS的外部命令,你可以把它所在的目录放到你的DOS搜索路径(path)中来使得它可以在任意位置运行。一个良好的习惯是在硬盘上建立一个bat或者batch 目录(例如C:/BATCH),然后将所有你编写的批处理文件放到该目录中,这样只要在path中设置上c:/batch,你就可以在任意位置运行所有你编写的批处理程序。 简单的说,批处理的作用就是自动的连续执行多条命令。 二、批处理中常用命令: 1.echo命令:表示显示此命令后的字符。字符不需要使用引号。其中,%和^两个字 符不能显示。 2.Echo off命令:表示在此语句后所有运行的命令都不显示命令行本身。即关闭echo 回显功能。可以使用echo on打开。 3.@命令:它是加在每个命令行的最前面,表示运行时不显示这一行的命令行(只能 影响当前行)。 4.call命令:调用另一个批处理文件(如果不用call而直接调用别的批处理文件, 那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令)。 5.pause命令:运行此句会暂停批处理的执行并在屏幕上显示Press any key to continue...的提示,等待用户按任意键后继续。如果不想显示以上英文提示信息, 可以这样写:pause>null 6.rem命令:表示此命令后的字符为解释行(注释),不执行,只是给自己今后参考 用的(相当于程序中的注释)。 7.::命令:与rem命令等效。 例1:用edit编辑a.bat文件,输入下列内容后存盘为c:/a.bat,执行该批处理 文件后可实现:将根目录中所有文件写入 a.txt中,启动UCDOS,进入WPS等功能。 批处理文件的内容为: 命令注释: @echo off //不显示后续命令行及当前命令行

#define 用法大全

#define用法集锦[修正版] Definition[定义]: The #define Directive You can use the #define directive to give a meaningful name to a constant in your program. The two forms of the syntax are: Syntax #define identifier token-stringopt #define identifier[( identifieropt, ... , identifieropt )] token-stringopt Usage[用法]: 1.简单的define定义 #define MAXTIME 1000 一个简单的MAXTIME 就定义好了,它代表1000,如果在程序里面写 if(i(y)?(x):(y); 这个定义就将返回两个数中较大的那个,看到了吗?因为这个“函数”没有类型检查,就好像一个函数模板似的,当然,它绝对没有模板那么安全就是了。可以作为一个简单的模板来使用而已。 但是这样做的话存在隐患,例子如下: #define Add(a,b) a+b; 在一般使用的时候是没有问题的,但是如果遇到如:c * Add(a,b) * d 的时候就会出现问题,代数式的本意是a+b 然后去和c,d 相乘,但是因为使用了define(它只是一个简单的替换),所以式子实际上变成了c*a + b*d 另外举一个例子: #define pin (int*); pin a,b; 本意是a 和b 都是int 型指针,但是实际上变成int* a,b; a 是int 型指针,而 b 是int 型变量。 这是应该使用typedef 来代替define,这样a 和b 就都是int 型指针了。

linux开机进入命令行模式

Linux默认启动后进入XWindow,但可以修改参数直接进入命令行界面。到底是进入XWindow还是进入命令行界面,是在系统初始化进行的。 对于大部分linux系统,初始化使用init进程,/etc/inittab 为其配置文件。例如 # The default runlevel id:2:initdefault # Boot-time system configuration/initialization script si::sysinit:/etc/init.d/rcS # Runlevels l0:0:wait:/etc/init.d/rc 0 l1:1:wait:/etc/init.d/rc 1 l2:2:wait:/etc/init.d/rc 2 l3:3:wait:/etc/init.d/rc 3 l4:4:wait:/etc/init.d/rc 4 l5:5:wait:/etc/init.d/rc 5 l6:6:wait:/etc/init.d/rc 6 z6:6:respawn:/sbin/sulogin # How to react to ctrl-alt-del ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now 这些内容的通用格式为id:runlevels:action:process。id 是惟一标识该项的字符序列。

runlevels 定义了操作所使用的运行级别。action 指定了要执行的特定操作。process 定义了要执行的进程。 # 对各个运行级的详细解释: 0 为停机,机器关闭。 1 为单用户模式,就像Win9x下的安全模式类似。 2 为多用户模式,但是没有NFS支持。 3 为完整的多用户模式,是标准的运行级。 4 一般不用,在一些特殊情况下可以用它来做一些事情。例如在笔记本电脑的电池用尽时,可以切换到这个模式来做一些设置。 5 就是X11,进到X Window系统了。 6 为重启,运行init 6机器就会重启。 XWindow是init5,字符是init3。将id设置为runlevel设置为3,就可以直接在系统初始化的时候直接进入文本界面。 但Ubuntu并没有采用init的方法,并没有/etc/inittab这个文件。init使用的是串行的方式,引导很耗时。RedHat9启动时串行执行大量的脚本以启动各种需要的服务(启动时可以看到)。Ubuntu采用了upstart,是一个基于事件的init 的替代程序,用于Ubuntu 发行版。Ubuntu中没有/etc/inittab这个文件,但用户可以自己添加。当系统中有/etc/inittab 时Ubuntu会按照配置来启动。 所以要想直接进命令行,第一种方法是用户添加/etc/inittab,不过Debian或是Ubuntu中默认run level是2,且2~5都是指X环境。(但命令行是几?不确定,尚未测试)

相关文档
最新文档