G++ 编译器主要命令

G++ 编译器主要命令
G++ 编译器主要命令

gcc and g++分别是gnu的c & c++编译器

gcc/g++在执行编译工作的时候,总共需要4步

1.预处理,生成.i的文件[预处理器cpp]

2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs]

3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as]

4.连接目标代码,生成可执行程序[链接器ld]

[参数详解]

-x language filename

设定文件所使用的语言,使后缀名无效,对以后的多个有效.也就是根

据约定c语言的后缀名称是.c的,而c++的后缀名是.c或者.cpp,如果你很个性,决定你的c代码文件的后缀名是.pig 哈哈,那你就要用这个参数,这个参数对他后面的文件名都起作用,除非到了下一个参数

的使用。

可以使用的参数吗有下面的这些

`c, `objective-c, `c-header, `c++, `cpp-output,

`assembler, and `assembler-with-cpp.

看到英文,应该可以理解的。

例子用法:

gcc -x c hello.pig

-x none filename

关掉上一个选项,也就是让gcc根据文件名后缀,自动识别文件类型例子用法:

gcc -x c hello.pig -x none hello2.c

-c

只激活预处理,编译,和汇编,也就是他只把程序做成obj文件

例子用法:

gcc -c hello.c

他将生成.o的obj文件

-s

只激活预处理和编译,就是指把文件编译成为汇编代码。

例子用法

gcc -s hello.c

他将生成.s的汇编代码,你可以用文本编辑器察看

-e

只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面.

例子用法:

gcc -e hello.c > pianoapan.txt

gcc -e hello.c | more

慢慢看吧,一个hello word 也要与处理成800行的代码

-o

制定目标名称,缺省的时候,gcc 编译出来的文件是a.out,很难听,如果

你和我有同感,改掉它,哈哈

例子用法

gcc -o hello.exe hello.c (哦,windows用习惯了)

gcc -o hello.asm -s hello.c

-pipe

使用管道代替编译中临时文件,在使用非gnu汇编工具的时候,可能有些问题

gcc -pipe -o hello.exe hello.c

-ansi

关闭gnu c中与ansi c不兼容的特性,激活ansi c的专有特性(包括禁止一些asm inline typeof关键字,以及unix,vax等预处理宏,

-fno-asm

此选项实现ansi选项的功能的一部分,它禁止将asm,inline和typeof用作

关键字。

-fno-strict-prototype

只对g++起作用,使用这个选项,g++将对不带参数的函数,都认为是没有显式

的对参数的个数和类型说明,而不是没有参数.

而gcc无论是否使用这个参数,都将对没有带参数的函数,认为城没有显式说

明的类型

-fthis-is-varialble

就是向传统c++看齐,可以使用this当一般变量使用.

-fcond-mismatch

允许条件表达式的第二和第三参数类型不匹配,表达式的值将为void类型

-funsigned-char

-fno-signed-char

-fsigned-char

-fno-unsigned-char

这四个参数是对char类型进行设置,决定将char类型设置成unsigned char(前

两个参数)或者 signed char(后两个参数)

-include file

包含某个代码,简单来说,就是便以某个文件,需要另一个文件的时候,就可以

用它设定,功能就相当于在代码中使用#include

例子用法:

gcc hello.c -include /root/pianopan.h

-imacros file

将file文件的宏,扩展到gcc/g++的输入文件,宏定义本身并不出现在输入文件

-dmacro

相当于c语言中的#define macro

-dmacro=defn

相当于c语言中的#define macro=defn

-umacro

相当于c语言中的#undef macro

-undef

取消对任何非标准宏的定义

-idir

在你是用#include"file"的时候,gcc/g++会先在当前目录查找你所制定的头

文件,如果没有找到,他回到缺省的头文件目录找,如果使用-i制定了目录,他

回先在你所制定的目录查找,然后再按常规的顺序去找.

对于#include,gcc/g++会到-i制定的目录查找,查找不到,然后将到系

统的缺省的头文件目录查找

-i-

就是取消前一个参数的功能,所以一般在-idir之后使用

-idirafter dir

在-i的目录里面查找失败,讲到这个目录里面查找.

-iprefix prefix

-iwithprefix dir

一般一起使用,当-i的目录查找失败,会到prefix+dir下查找

-nostdinc

使编译器不再系统缺省的头文件目录里面找头文件,一般和-i联合使用,明确

限定头文件的位置

-nostdin c++

规定不在g++指定的标准路经中搜索,但仍在其他路径中搜索,.此选项在创建

libg++库使用

-c

在预处理的时候,不删除注释信息,一般和-e使用,有时候分析程序,用这个很

方便的

-m

生成文件关联的信息。包含目标文件所依赖的所有源代码

你可以用gcc -m hello.c来测试一下,很简单。

-mm

和上面的那个一样,但是它将忽略由#include造成的依赖关系。

-md

和-m相同,但是输出将导入到.d的文件里面

-mmd

和-mm相同,但是输出将导入到.d的文件里面

-wa,option

此选项传递option给汇编程序;如果option中间有逗号,就将option分成多个选

项,然后传递给会汇编程序

-wl.option

此选项传递option给连接程序;如果option中间有逗号,就将option分成多个选

项,然后传递给会连接程序.

-llibrary

制定编译的时候使用的库

例子用法

gcc -lcurses hello.c

使用ncurses库编译程序

-ldir

制定编译的时候,搜索库的路径。比如你自己的库,可以用它制定目录,不然

编译器将只在标准库的目录找。这个dir就是目录的名称。

-o0

-o1

-o2

-o3

编译器的优化选项的4个级别,-o0表示没有优化,-o1为缺省值,-o3优化级别最

-g

只是编译器,在编译的时候,产生条是信息。

-gstabs

此选项以stabs格式声称调试信息,但是不包括gdb调试信息.

-gstabs+

此选项以stabs格式声称调试信息,并且包含仅供gdb使用的额外调试信息.

-ggdb

此选项将尽可能的生成gdb的可以使用的调试信息.

-static

此选项将禁止使用动态库,所以,编译出来的东西,一般都很大,也不需要什么

动态连接库,就可以运行.

-share

此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库. -traditional

试图让编译器支持传统的c语言特性

gnu 的调试器称为 gdb,该程序是一个交互式工具,工作在字符模式。在 x window 系统中,有一个 gdb 的

前端图形工具,称为 xxgdb。gdb 是功能强大的调试程序,可完成如下的调试任务:

* 设置断点;

* 监视程序变量的值;

* 程序的单步执行;

* 修改变量的值。

在可以使用 gdb 调试程序之前,必须使用 -g 选项编译源文件。可在 makefile 中如下定义 cflags 变量:

cflags = -g

运行 gdb 调试程序时通常使用如下的命令:

gdb progname

在 gdb 提示符处键入help,将列出命令的分类,主要的分类有:

* aliases:命令别名

* breakpoints:断点定义;

* data:数据查看;

* files:指定并查看文件;

* internals:维护命令;

* running:程序执行;

* stack:调用栈查看;

* statu:状态查看;

* tracepoints:跟踪程序执行。

键入 help 后跟命令的分类名,可获得该类命令的详细清单。

#deno#

gdb 的常用命令

表 1-4 常用的 gdb 命令

命令解释

break num 在指定的行上设置断点。

bt 显示所有的调用栈帧。该命令可用来显示函数的调用顺序。

clear 删除设置在特定源文件、特定行上的断点。其用法为:clear filename:num。continue 继续执行正在调试的程序。该命令用在程序由于处理信号或断点而

导致停止运行时。

display expr 每次程序停止后显示表达式的值。表达式由程序定义的变量组成。file file 装载指定的可执行文件进行调试。

help name 显示指定命令的帮助信息。

info break 显示当前断点清单,包括到达断点处的次数等。

info files 显示被调试文件的详细信息。

info func 显示所有的函数名称。

info local 显示当函数中的局部变量信息。

info prog 显示被调试程序的执行状态。

info var 显示所有的全局和静态变量名称。

kill 终止正被调试的程序。

list 显示源代码段。

make 在不退出 gdb 的情况下运行 make 工具。

next 在不单步执行进入其他函数的情况下,向前执行一行源代码。

print expr 显示表达式 expr 的值。

1.8.5 gdb 使用范例

-----------------

清单一个有错误的 c 源程序 bugging.c

-----------------

#include

#include

static char buff [256];

static char* string;

int main ()

{

printf ("please input a string: ");

gets (string);

printf ("\nyour string is: %s\n", string);

}

-----------------

上面这个程序非常简单,其目的是接受用户的输入,然后将用户的输入打印出来。该程序使用了一个未经过初

始化的字符串地址 string,因此,编译并运行之后,将出现 segment fault 错误:

$ gcc -o test -g test.c

$ ./test

please input a string: asfd

segmentation fault (core dumped)

为了查找该程序中出现的问题,我们利用 gdb,并按如下的步骤进行:

1.运行 gdb bugging 命令,装入 bugging 可执行文件;

2.执行装入的 bugging 命令;

3.使用 where 命令查看程序出错的地方;

4.利用 list 命令查看调用 gets 函数附近的代码;

5.唯一能够导致 gets 函数出错的因素就是变量 string。用 print 命令查看string 的值;

6.在 gdb 中,我们可以直接修改变量的值,只要将 string 取一个合法的指针值就可以了,为此,我们在第

11 行处设置断点;

7.程序重新运行到第 11 行处停止,这时,我们可以用 set variable 命令修改 string 的取值;

C语言习题集(预处理命令篇)

第六章预处理命令 6.1 选择题 1.下面叙述中正确的是()。 A. 带参数的宏定义中参数是没有类型的 B. 宏展开将占用程序的运行时间 C. 宏定义命令是C语言中的一种特殊语句 D. 使用#include命令包含的头文件必须以“.h”为后缀 2.下面叙述中正确的是()。 A. 宏定义是C语句,所以要在行末加分号 B. 可以使用#undef命令来终止宏定义的作用域 C. 在进行宏定义时,宏定义不能层层嵌套 D. 对程序中用双引号括起来的字符串内的字符,与宏名相同的要进行置换 3.在“文件包含”预处理语句中,当#include后面的文件名用双引号括起时,寻找被包含文件的方式为()。 A. 直接按系统设定的标准方式搜索目录 B. 先在源程序所在目录搜索,若找不到,再按系统设定的标准方式搜索 C. 仅仅搜索源程序所在目录 D. 仅仅搜索当前目录 4.下面叙述中不正确的是()。 A. 函数调用时,先求出实参表达式,然后带入形参。而使用带参的宏只是进行简单的 字符替换 B. 函数调用是在程序运行时处理的,分配临时的内存单元。而宏展开则是在编译时进 行的,在展开时也要分配内存单元,进行值传递 C. 对于函数中的实参和形参都要定义类型,二者的类型要求一致,而宏不存在类型问 题,宏没有类型 D. 调用函数只可得到一个返回值,而用宏可以设法得到几个结果 5.下面叙述中不正确的是()。 A. 使用宏的次数较多时,宏展开后源程序长度增长。而函数调用不会使源程序变长 B. 函数调用是在程序运行时处理的,分配临时的内存单元。而宏展开则是在编译时进 行的,在展开时不分配内存单元,不进行值传递 C. 宏替换占用编译时间 D. 函数调用占用编译时间 6.下面叙述中正确的是( )。 A. 可以把define和if定义为用户标识符 B. 可以把define定义为用户标识符,但不能把if定义为用户标识符 C. 可以把if定义为用户标识符,但不能把define定义为用户标识符 D. define和if都不能定义为用户标识符 7.下面叙述中正确的是()。 A.#define和printf都是C语句 B.#define是C语句,而printf不是 C.printf是C语句,但#define不是 D.#define和printf都不是C语句

常用网络测试命令实验报告

西安郵電學院 计算机网络技术及应用实验 报告书 院部名称:管理工程学院 学生姓名:XXX 专业名称:信息管理与信息系统班级:10XX 学号:0210XXXX 时间:2012年 5 月 4 日

一、实验目的 1.掌握基本的网络知识。 2.掌握CMD一些基本命令,并学会运用这些命令排除一些基本问题。 二、具体实验内容及步骤 1.Ping命令的使用 点击―开始‖—〉―运行‖,在―运行‖对话框―打开‖后键入cmd,按―确定‖,到命令行方式下。 实验步骤: 1)回环测试。这个ping命令被送到本地计算机IP软件。这一命令可以用来检测TCP/IP的安装或运行存在的某些最基本的问题。 C:\>ping 127.0.0.1 2)Localhost是127.0.0.1的别名,我们也可以利用localhost来进行回环测试,每台计算机都能够将名称localhost转换成地址127.0.0.1。如果做不到这一点,则表示主机文件(host)中存在问题。 C:\>ping localhost

3)Ping本机IP。若无回复,说明本地计算机的TCP/IP安装或配置存在问题。 C:\>ping –t 192.168.2.37 在命令中加入参数-t,本地计算机应该始终对该ping命令做出应答,使用ctrl+C终止操作。 4)Ping局域网内其它主机IP。该命令对局域网内的其它主机发送回送请求信息。

如果能够收到对方主机的回送应答信息,表明本地网络中的网卡和传输媒体运行正常。 C:\>ping 192.168.2.55 5)Ping网关:如果能够收到应答信息,则表明网络中的网关路由器运行正常。 C:\>ping 192.168.2.1 6)Ping域名服务器:如果能够收到应答信息,则表明网络中的域名服务器运行正常。 C:\>ping 202.117.128.2

测试网速命令 必须学会的几个网络测试命令

测试网速命令必须学会的几个网络测试命令 了解和把握下面几个命令将会有助于您更快地检测到网络故障所在,从而节省时间dota测试模式命令,进步效率。 Ping Ping是测试网络联接状况以及信息包发送和接收状况非常有用的工具,是网络测试最常用的命令。Ping向目标主机(地址)发送一个回送请求数据包显卡测试命令,要求目标主机收到请求后给予答复,从而判定网络的响应时间和本机是否与目标主机(地址)联通。假如执行Ping不成功,则可以猜测故障出现在以下几个方面:网线故障,网络适配器配置不正确,IP地址不正确。假如执行Ping成功而网络仍无法使用,那么题目很可能出在网络系统的软件配置方面,Ping成功只能保证本机与目标主机间存在一条连通的物理路径。 命令格式: ping IP地址或主机名 [-t] [-a] [-n count] [-l size] 参数含义: -t不停地向目标主机发送数据; -a 以IP地址格式来显示目标主机的网络地址; -n count 指定要Ping多少次测试网速的命令声卡测试命令,具体次数由count来指定; -l size 指定发送到目标主机的数据包的大小。 例如当您的机器不能访问Internet,首先您想确认是否是本地局域网的故障。假定局域网的代理服务器IP地址为202.168.0.1测试网络的命令,您可以使用Ping 202.168.0.1命令查看本机是否和代理服务器联通。又如,测试本机的网卡是否正确安装的常用命令是ping 127.0.0.1。 Tracert Tracert命令用来显示数据包到达目标主机所经过的路径,并显示到达每个节点的时间。命令功能同Ping类似测试网速命令,但它所获得的信息要比Ping命令具体得多,它把数据包所走的全部路径、节点的IP以及花费的时间都显示出来。该命令比较适用于大型网络。 命令格式: tracert IP地址或主机名 [-d][-h maximumhops][-j host_list] [-w timeout] 参数含义: -d 不解析目标主机的名字; -h maximum_hops 指定搜索到目标地址的最大跳跃数; -j host_list 按照主机列表中的地址开释源路由; -w timeout 指定超时时间间隔,程序默认的时间单位是毫秒。 例如大家想要了解自己的计算机与目标主机https://www.360docs.net/doc/c03515091.html,之间具体的传输路径信息,可以在MS-DOS方式输进tracert https://www.360docs.net/doc/c03515091.html,。 假如我们在Tracert命令后面加上一些参数,还可以检测到其他更具体的信息,例如使用参数-dping命令测试网速,可以指定程序在跟踪主机的路径信息时,同时也解析目标主机的域名。 Netstat Netstat命令可以帮助网络治理员了解网络的整体使用情况。它可以显示当前正在活动的网络连接的具体信息,例如显示网络连接、路由表和网络接口信息dota测试命令,可以

编译预处理

第九章编译预处理 9.1 选择题 【题9.1】以下叙述中不正确的是。 A)预处理命令行都必须以#号开始 B)在程序中凡是以#号开始的语句行都是预处理命令行 C)C程序在执行过程中对预处理命令行进行处理 D)以下是正确的宏定义 #define IBM_PC 【题9.2】以下叙述中正确的是。 A)在程序的一行上可以出现多个有效的预处理命令行 B)使用带参的宏时,参数的类型应与宏定义时的一致 C)宏替换不占用运行时间,只占编译时间 D)在以下定义中C R是称为“宏名”的标识符 #define C R 045 【题9.3】请读程序: #define ADD(x) x+x main() { int m=1,n=2,k=3; int sum=ADD(m+n)*k; printf(“sum=%d”,sum); } 上面程序的运行结果是。 A)sum=9 B)sum=10 C)sum=12 D)sum=18 【题9.4】以下程序的运行结果是。 #define MIN(x,y) (x)<(y)?(x):(y) main() { int i=10,j=15,k; k=10*MIN(i,j); printf(“%d\n”,k); } A)10 B)15 C)100 D)150 【题9.5】在宏定义#define PI 3.14159中,用宏名PI代替一个。 A)常量B)单精度数C)双精度数D)字符串

【题9.6】以下程序的运行结果是。 #include #define FUDGE(y) 2.84+y #define PR(a) printf(“%d”,(int)(a)) #define PRINT1(a) PR(a); putchar(‘\n’) main() { int x=2; PRINT1(FUDGE(5)*x); } A)11 B)12 C)13 D)15 【题9.7】以下有关宏替换的叙述不正确的是。 A)宏替换不占用运行时间B)宏名无类型 C)宏替换只是字符替换D)宏名必须用大写字母表示 【题9.8】C语言的编译系统对宏命令的处理是。 A)在程序运行时进行的 B)在程序连接时进行的 C)和C程序中的其它语句同时进行编译的 D)在对源程序中其它成份正式编译之前进行的 【题9.9】若有宏定义如下: #define X 5 #define Y X+1 #define Z Y*X/2 则执行以下printf语句后,输出结果是。 int a; a=Y; printf(“%d\n”,Z); printf(“%d\n”,--a); A)7 B)12 C)12 D)7 6 6 5 5 【题9.10】若有以下宏定义如下: #define N 2 #define Y(n) ((N+1)*n) 则执行语句z=2*(N+Y(5));后的结果是。 A)语句有错误B)z=34 C)z=70 D)z无定值 【题9.11】若有宏定义:#define MOD(x,y) x%y 则执行以下语句后的输出为。 int z,a=15,b=100; z=MOD(b,a); printf(“%d\n”,z++);

常用的网络测试命令

常用的网络测试命令 在进行各类网络实验和网络故障排除时,经常需要用到相应的测试工具。网络测试工具基本上分为两类:专用测试工具和系统集成的测试命令,其中,专用测试工具虽然功能强大, 但价格较为昂贵,主要用于对网络的专业测试。对于网络实验和平时的网络维护来说,通过熟练掌握由系统(操作系统和网络设备)集成的一些测试命令,就可以判断网络的工作状态和常见的网络故障。我们以 Windows XP 为例,介绍一些常见命令的使用方法。 1 Ping网络连通测试命令 1.1 Ping 命令的功能 Ping 是网络连通测试命令,是一种常见的网络工具。用这种工具可以测试端到端的连 通性,即检查源端到目的端网络是否通畅。该命令主要是用来检查路由是否能够到达,Ping 的原理很简单,就是通过向计算机发送Internet控制信息协议(ICMP )从源端向目的端发 出一定数量的网络包,然后从目的端返回这些包的响应,以校验与远程计算机或本地计算机 的连接情况。对于每个发送网络包,Ping 最多等待 1 秒并显示发送和接收网络包的数量, 比较每个接收网络包和发送网络包,以校验其有效性。默认情况下,发送四个回应网络包。 由于该命令的包长非常小,所以在网上传递的速度非常快,可以快速的检测要去的站点是否可达,如果在一定的时间内收到响应,则程序返回从包发出到收到的时间间隔,这样根据时间间隔就可以统计网络的延迟。如果网络包的响应在一定时间间隔内没有收到,则程序认为包丢失,返回请求超时的结果。这样如果让Ping 一次发一定数量的包,然后检查收到相应 的包的数量,则可统计出端到端网络的丢包率,而丢包率是检验网络质量的重要参数。 一般在去某一站点是可以先运行一下该命令看看该站点是否可达。如果执行Ping不成功,则可以预测故障出现在以下几个方面: 网线是否连通 网络适配器配置是否正确 IP 地址是否可用 如果执行Ping 成功而网络仍无法使用,那么问题很可能出在网络系统的软件配置方面,Ping 成功只能保证当前主机与目的主机间存在一条连通的物理路径。它的使用格式是在命 令提示符下键入: ping IP 地址或主机名,执行结果显示响应时间,重复执行这个命令,可以 发现 Ping 报告的响应时间是不同的。 如果网络管理员和用户的Ping 命令都失败了, Ping 命令显示的出错信息是很有帮助的, 可以指导进行下一步的测试计划。这时可注意 Ping 命令显示的出错信息,这种出错信息通常分 为三种情况: (1) unknown host(不知名主机),该远程主机的名字不能被DNS(域名服务器)转换成ip 地址。网络故障可能为 DNS 有故障,或者其名字不正确,或者网络管理员的系统与远程 主机之间的通信线路有故障。 (2)network unreachable (网络不能到达),这是本地系统没有到达远程系统的路由,可 用 netstat-rn 检查路由表来确定路由配置情况。

c语言中预编译指令的应用

#if #ifdef和#ifndef的用法和区别 #if #ifdef和#ifndef用法 移位运算符的优先级高于条件运算符,重载是不能改变运算符优先级的,这点要注意,所以代码应当像下面这样调整,写宏的时候一定要注意优先级,尽量用括号来屏蔽运算符优先级。#define MAXIMUM(x,y) ((x)>(y)?(x):(y)) #define MINIMUM.... #include #define MAX #define MAXIMUM(x,y) x>y?x:y #define MINIMUM(x,y) x

实验一常用网络命令

实验1常用网络命令 1.ping命令 ping是个使用频率极高的实用程序,主要用于确定网络的连通性。这对确定网络是否正确连接,以及网络连接的状况十分有用。简单的说,ping就是一个测试程序,如果ping运行正确,大体上就可以排除网络访问层、网卡、Modem的输入输出线路、电缆和路由器等存在的故障,从而缩小问题的范围。 ping能够以毫秒为单位显示发送请求到返回应答之间的时间量。如果应答时间短,表示数据报不必通过太多的路由器或网络,连接速度比较快。ping还能显示TTL(Time To Live,生存时间)值,通过TTL 值可以推算数据包通过了多少个路由器。 (1) 命令格式 ping主机名 ping域名 ping IP地址 如图所示,使用ping命令检查到I的计算机的连通性,该例为连接正常。共发送了四个测试数据包,正确接收到四个数据包。 (2) ping命令的基本应用 一般情况下,用户可以通过使用一系列ping命令来查找问题出在什么地方,或检验网络运行的情况。下面就给出一个典型的检测次序及对应的可能故障: ① 如果测试成功,表明网卡、TCP/IP协议的安装、IP地址、子网掩码的设置正常。如果测试不成功,就表示TCP/IP的安装或设置存在有问题。 ②ping 本机IP地址 如果测试不成功,则表示本地配置或安装存在问题,应当对网络设备和通讯介质进行测试、检查并排除。 ③ping局域网内其他IP 如果测试成功,表明本地网络中的网卡和载体运行正确。但如果收到0个回送应答,那么表示子网掩码不正确或网卡配置错误或电缆系统有问题。 ④ping 网关IP 这个命令如果应答正确,表示局域网中的网关路由器正在运行并能够做出应答。 ⑤ping 远程IP 如果收到正确应答,表示成功的使用了缺省网关。对于拨号上网用户则表示能够成功的访问Internet(但不排除ISP的DNS会有问题)。 ⑥ping localhost ⑦ping 对此域名执行Ping命令,计算机必须先将域名转换成IP地址,通常是通过DNS服务器。如果这里出现故障,则表示本机DNS服务器的IP地址配置不正确,或它所访问的DNS服务器有故障如果上面所列出的所有ping命令都能正常运行,那么计算机进行本地和远程通信基本上就没有问题了。但是,这些命令的成功并不表示你所有的网络配置都没有问题,例如,某些子网掩码错误就可能无法用这些方法检测到。

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" 第一种方法是用尖括号把头文件括起来。这种格式告诉预处理程序在编译器自带的或外部库的头文件中搜索被包含的头文件。第二种方法是用双引号把头文件括起来。这种格式告诉预处理程序在当前被编译的应用程序的源代码文件中搜索被包含的头文件,如果找不到,再搜索编译器自带的头文件。 采用两种不同包含格式的理由在于,编译器是安装在公共子目录下的,而被编译的应用程序是在它们自己的私有子目录下的。一个应用程序既包含编译器提供的公共头文件,也包含自定义的私有头文件。采用两种不同的包含格式使得编译器能够在很多头文件中区别出一组公共的头文件。

C中的预处理命令

C中的预处理命令是由ANSIC统一规定的,但它不是C语言的本身组成部分,不能直接对它们进行编译,因为编译程序无法识别它们。必须对程序进行通常的编译(包括词法和语法分析,代码生成,优化等)之前,先对程序中这些特殊的命令进行“预处理”,例如:如果程序中用#include命令包含一个文件“stdio.h”,则在预处理时,将stdio.h文件中的实际内容代替该命令。经过预处理后的程序就像没有使用预处理的程序一样干净了,然后再由编译程序对它进行编译处理,得到可供执行的目标代码。现在的编译系统都包括了预处理,编译和连接部分,在进行编译时一气呵成。我们要记住的是预处理命令不是C语言的一部分,它是在程序编译前由预处理程序完成的。 C提供的预处理功能主要有三种:宏定义,文件包含,条件编译。它们的命令都以“#”开头。 一,宏定义:用一个指定的标识符来代表一个字符串,它的一般形式为: #define 标识符字符串 #define PI 3.1415926 我们把标识符称为“宏名”,在预编译时将宏名替换成字符串的过程称为“宏展开”,而#define 是宏定义命令。 几个应该注意的问题: 1,是用宏名代替一个字符串,也就是做简单的置换,不做正确性检查,如把上面例子中的1写为小写字母l,预编译程序是不会报错的,只有在正式编译是才显示出来。 2,宏定义不是C语句,不必在行未加分号,如果加了分号则会连分号一起置换。 3,#define语句出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束,通常#define命令写在文件开头,函数之前,作为文件的一部分,在此文件范围内有效。4,可以用#undef命令终止宏定义的作用域。如: #define PI 3.1415926 main(){ } #undef PI mysub(){ } 则在mysub中PI 不代表3.1415926。 5,在进行宏定义时,可以引用已定义的宏名,可以层层置换。 6,对程序中用双撇号括起来的字符串内的字符,即使与宏名相同,也不进行置换。 7,宏定义是专门用于预处理命令的一个专有名词,它与定义变量的含义不同,只做字符替换不做内存分配。 带参数的宏定义,不只进行简单的字符串替换,还进行参数替换。定义的一般形式为:#define 宏名(参数表)字符串 如:#define S(a,b) a*b,具体使用的时候是int area; area=(2,3); 对带参数的宏定义是这样展开置换的:在程序中如果有带参数的宏(如area=(2,3)),则按#define命令行中指定的字符串从左到右进行置换。如果串中包含宏中的形参(如a,b),则将程序语句中的相关参数(可以是常量,变量,或表达式)代替形参。如果宏定义中的字符串中的字符不是参数字符(如上*),则保留,这样就形成了置换的字符串。 带参数的宏与函数有许多相似之处,在调用函数时也是在函数名后的括号内写实参,也要求实参与形参的数目相等,但它们之间还有很大的不同,主要有: 1,函数调用时,先求出实参表达式的值,然后代入形参,而使用带参的宏只是进行简单的字符替换。

常用网络测试命令

常用网络测试命令 Ping Ping是测试网络联接状况以及信息包发送和接收状况非常有用的工具,是网络测试最 常用的命令。Ping向目标主机(地址)发送一个回送请求数据包,要求目标主机收到请求后给予答复,从而判断网络的响应时间和本机是否与目标主机(地址)联通。 如果执行Ping不成功,则可以预测故障出现在以下几个方面:网线故障,网络适配器配置不正确,IP地址不正确。如果执行Ping成功而网络仍无法使用,那么问题很可能出在网络系统的软件配置方面,Ping成功只能保证本机与目标主机间存在一条连通的物理路径。 命令格式: ping IP地址或主机名[-t] [-a] [-n count] [-l size] 参数含义: -t不停地向目标主机发送数据; -a 以IP地址格式来显示目标主机的网络地址; -n count 指定要Ping多少次,具体次数由count来指定; -l size 指定发送到目标主机的数据包的大小。 例如当您的机器不能访问Internet,首先您想确认是否是本地局域网的故障。假定局域网的代理服务器IP地址为202.168.0.1,您可以使用Ping避免202.168.0.1命令查看本机是否和代理服务器联通。又如,测试本机的网卡是否正确安装的常用命令是ping 127.0.0.1。 Tracert Tracert命令用来显示数据包到达目标主机所经过的路径,并显示到达每个节点的时间。命令功能同Ping类似,但它所获得的信息要比Ping命令详细得多,它把数据包所走的全部路径、节点的IP 以及花费的时间都显示出来。该命令比较适用于大型网络。 命令格式: tracert IP地址或主机名[-d][-h maximumhops][-j host_list] [-w timeout] 参数含义: -d 不解析目标主机的名字; -h maximum_hops 指定搜索到目标地址的最大跳跃数; -j host_list 按照主机列表中的地址释放源路由; -w timeout 指定超时时间间隔,程序默认的时间单位是毫秒。 例如大家想要了解自己的计算机与目标主机https://www.360docs.net/doc/c03515091.html,之间详细的传输路径信息,可以在MS-DOS方式输入tracert https://www.360docs.net/doc/c03515091.html,。 如果我们在Tracert命令后面加上一些参数,还可以检测到其他更详细的信息,例如使用参数-d,可以指定程序在跟踪主机的路径信息时,同时也解析目标主机的域名。 Netstat Netstat命令可以帮助网络管理员了解网络的整体使用情况。它可以显示当前正在活动的网络连接的详细信息,例如显示网络连接、路由表和网络接口信息,可以统计目前总共有哪些网络连接正在运行。

第9章 预处理命令

第9章预处理命令 宏定义不是C语句,所以不能在行尾加分号。如果加了分号则会连分号一起进行臵换。 可以用#undef命令终止宏定义的作用域。 对程序中用“”括起来的内容(即字符串内的字符),即使与宏名相同,也不进行臵换。宏定义只做字符替换,不分配内存空间。 宏名不是变量,不分配存储空间,也不能对其进行赋值。 在宏展开时,预处理程序仅对宏名作简单的字符串替换,不作任何检查。 在进行宏定义时,可以引用已定义的宏名 无参宏定义的一般格式: #define 标识符字符串 将这个标识符(名字)称为“宏名”,在用预编译时将宏名替换成字符串的过程称为“宏展开”。#define是宏定义命令。 带参宏定义的一般格式: #define 宏名(形参表)字符串 带参宏的调用和宏展开: 调用格式:宏名(实参表); 宏展开(又称为宏替换)的方法:用宏调用提供的实参直接臵换宏定义中相应的形参,非形参字符保持不变。 定义有参宏时,宏名与左圆括号之间不能留有空格。否则,C编译系统会将空格以后的所有字符均作为替代字符串,而将该宏视为无参宏。 有参宏的展开,只是将实参作为字符串,简单地臵换形参字符串,而不做任何语法检查。 为了避免出错,可以在所有形参外,甚至整个字符串外,均加上一对圆括号。 如: #define S(r) 3.14*(r)*(r) 则:area=S(a+b); 展开后为: area=3.14*(a+b)*(a+b); 调用有参函数时,是先求出实参的值,然后再复制一份给形参。而展开有参宏时,只是将实参简单地臵换形参。函数调用是在程序运行时处理的,为形参分配临时的内存单元;而宏展开则是在编译前进行的,在展开时不分配内存单元,不进行值的传递,也没有“返回值”的概念。调用函数只可得到一个返回值,而用宏可以设法得到几个结果。 在有参函数中,形参都是有类型的,所以要求实参的类型与其一致;而在有参宏中,形参和宏名都没有类型,只是一个简单的符号代表,因此,宏定义时,字符串可以是任何类型的数据。 使用宏次数多时,宏展开后源程序变长,因为每展开一次都是程序增长,而函数调用不会使源程序变长。 宏替换不占用运行时间,只占编译时间。而函数调用则占用运行时间(分配单元、保留现场、值传递、返回)。 在程序中如果有带实参的宏,则按#define命令行中指定的字符串从左到右进行臵换。如果字符串中包含宏中的形参,则将程序语句中相应的实参(可以是常量、变量或表达式)代替形参。如果宏定义中的字符串中的字符不是参数字符,则保留。

计算机网络经典命令大全

计算机网络经典命令大全 1 .最基本,最常用的,测试物理网络的 ping 192.168.0.8 -t ,参数-t是等待用户去中断测试 2.查看DNS、IP、Mac等 A.Win98:winipcfg B.Win2000以上:Ipconfig/all C.NSLOOKUP:如查看河北的DNS C:\>nslookup Default Server: https://www.360docs.net/doc/c03515091.html, Address: 202.99.160.68 >server 202.99.41.2 则将DNS改为了41.2 > https://www.360docs.net/doc/c03515091.html, Server: https://www.360docs.net/doc/c03515091.html, Address: 202.99.160.68 Non-authoritative answer: Name: https://www.360docs.net/doc/c03515091.html, Address: 202.99.160.212 3.网络信使(经常有人问的~) Net send 计算机名/IP|* (广播) 传送内容,注意不能跨网段 net stop messenger 停止信使服务,也可以在面板-服务修改 net start messenger 开始信使服务 4.探测对方对方计算机名,所在的组、域及当前用户名(追捕的工作原理) ping -a IP -t ,只显示NetBios名 nbtstat -a 192.168.10.146 比较全的 https://www.360docs.net/doc/c03515091.html,stat -a 显示出你的计算机当前所开放的所有端口 netstat -s -e 比较详细的显示你的网络资料,包括TCP、UDP、ICMP 和 IP的统计等 6.探测arp绑定(动态和静态)列表,显示所有连接了我的计算机,显示对方IP和MAC地址arp -a 7.在代理服务器端

变量的存储类型与预编译命令

实验十二变量的存储类型与与编译命令(上机练习)1、输入下面的程序并运行,分析为什么会得到此结果。 #include #define PI 3.1415926 #define S(r) PI*r*r float S1(int r) { return(PI*r*r); } void main() { printf("%f\n",S(2)); printf("%f\n",S(1+1)); printf("%f\n",S1(2)); printf("%f\n",S(1+1)); } 具体要求: ①分析程序的运行结果。 ②认真比较函数和宏定义的不同之处。 2.以下程序的输出结果是()。 A.15 B.100 C.10 D.150 #include #define MIN(x,y) (x)<(y)?(x):(y) main() { int i,j,k;i=10;j=15;k=10*MIN(i,j); printf("%d\n",k);} 3.以下程序中的for循环执行的次数是()。 A.5 B.6 C.8 D.9 #define N 2 #define M N+1 #define NUM (M+1)*M/2 main() { int i;for(i=1;i<=NUM;i++); printf(“%d\n”,i);} 4.以下程序的输出结果是()。

A.11 B.12 C.13 D.15 #include “stdio.h” #define FUDGF(y) 2.84+y #define PR(a) printf(“%d”,(int)(a)) #define PRINT1(a) PR(a);putchar(‘\n’) main() { int x=2;PRINT1(FUDGF(5)*x); } 5.以下叙述正确的是()。 A.用#include包含的头文件的后缀不可以是“.a” B.若一些源程序中包含某个头文件;当该头文件有错时,只需对该头文件进行修改,包含此头文件所有源程序不必重新进行编译 C.宏命令可以看做是一行C语句 D.C编译中的预处理是在编译之前进行的。 6.以下有关宏替换的叙述不正确的是()。 A.宏替换不占用运行时间 B.宏名无类型 C.宏替换只是字符替换 D.宏名必须用大写字母表示7.宏定义#define G 9.8中的宏名G代替() A.一个单精度实数 B.一个双精度实数C.一个字符串 D.不确定类型的数8.若有宏定义: #define MOD(x,y) x%y 则执行以下程序段的输出为() int z,a=15,b=100; z=MOD(b,a); printf(“%d\n”,z++); A.11 B.10 C.6 D.宏定义不合法 9.以下程序的运行结果是()。 #define DOUBLE(r) r*r main( ) { int y1=1,y2=2,t; t=DOUBLE(y1+y2); printf(“%d\n”,t);} A.11 B.10 C.5 D.9 10.下列程序段的输出结果是()

多文件结构和编译预处理命令

多文件结构和编译预处理命令 C++完整的源程序一般由三部分构成:类的定义,类成员的实现,主函数 在较大的项目中,常需要多个源文件(即多个编译单元),c++要求一个类的定义必须在使用该类的编译单元中。因此,把类的定义写在头文件中。 (重点)一个项目至少分三个文件:类定义文件(.h)、类实现文件(.cpp)、类的使用文件(.cpp) (重点)对于复杂的程序:每个类都有单独的类定义和类实现。这样做的好处:可以对不同的文件进行单独编写、编译,最后链接,同时利用类的封 装性,在程序的调试和修改时只对其中某一个类的定义和实现修改,其余保持不动。 预处理指令声明中出现的注释以及一行单独一个#符号的情况在预编译处理过程中都会被 忽略掉。 宏定义在c++中依然使用,但最好的方式是在类型说明语句中用const修饰来取代宏定义。(重点)大型程序中,往往需要使用很多头文件,因此要发现重复包含并不容易。要解决这个问题,我们可以在头文件使用条件编译。(三种方式) 表1是所有预处理指令和意义 指令意义 #define 定义宏 #undef 取消定义宏 #include 包含文件 #ifdef 其后的宏已定义时激活条件编译块 #ifndef 其后的宏未定义时激活条件编译块 #endif 中止条件编译块 #if 其后表达式非零时激活条件编译块 #else 对应#ifdef, #ifndef, 或#if 指令 #elif #else 和#if的结合 #line 改变当前行号或者文件名 #error 输出一条错误信息 #pragma 为编译程序提供非常规的控制流信息 宏定义 #define指令定义宏,宏定义可分为两类:简单宏定义,带参数宏定义。 简单宏定义有如下一般形式: #define 名字替换文本 它指示预处理器将源文件中所有出现名字记号的地方都替换为替换文本,替换文本可以是任

实验二网络常用检验命令实验报告

计算机网络 实验报告 实验名称:《常用网络测试命令》 姓名:学号:专业:信息管理与信息系统专业班级:指导教师:

实验成绩: 批阅教师签字: 一、实验目的 (1)熟悉基本的网络测试命令操作:学会ping、tracert、route、ipconfig、arp、netstat、net等网络测试命令的功能与基本用法。 (2)为后续其他实验奠定基础。 二、实验内容与实验步骤 1. 使用ping命令测试网络的连通性 ?ping 127.0.0.1

?ping 本机IP ?ping 局域网内其他IP ?ping 网关IP ?ping 远程IP ?ping https://www.360docs.net/doc/c03515091.html, ?连续ping6个包 ?发出去的每个包数据部分包含1000个字节 2. 使用ipconfig命令查看计算机的TCP/IP配置 在命令提示符状态分别输入ipconfig 、 ipconfig/all 命令格式,查看并记录当前计算机的基本TCP/IP参数设置,观察两次命 令所有显示的内容有什么不同 3. 使用arp命令显示和修改本地计算机上的ARP高速缓存 (1)在实验机上输入arp –a(或arp -g)命令显示当前计算机的ARP缓存。 (2)执行arp –d命令,再次用arp –a命令,观察显示结果。 (3)查找隔壁主机的ip地址,在实验机上输入ping 隔壁主机IP地址,再输入arp –a 命令,观察显示结果。 (4)用步骤2清空ARP缓存,然后输入arp –s 隔壁主机IP 地址以及错误的MAC 地址。用arp –a 命令显示结果。 (5)重复步骤3,再次观察显示结果。

4. 使用tracert命令跟踪路由 在实验机上输入tracert https://www.360docs.net/doc/c03515091.html, 命令,跟踪数据报从本地机到达 https://www.360docs.net/doc/c03515091.html, 所经过的路径。 5. 使用net命令进行网络配置 ?将计算机名为T090的主机中的share目录以及光驱等设置成共享,然后在实验机上输入net view\\ T090 查看名为**计算机的共享资源列表。 ?使用net user 命令: (1)新建一个名为“alice”,密码为“123456”的用户 (2)查看名为“alice”用户的信息 (3)新建一个登陆时间受限制的用户,比如,新建一个名为“edward”,密码为111111,登陆时间权限为每周一到周五早上8点到晚上6点。 (4)查看名为“edward”用户的信息 (5)删除刚才创建的这两个用户 三、实验环境 操作系统:windows XP 开发平台的名称及版本:cmd

网络诊断常用的几个常用命令

网络诊断常用的几个常用命令 net 命令 net accounts 查阅当账号设置 net config server 查阅本网络配置信息统计 net share 查阅本地计算机上的共享文件 net user 查阅本地用户账号 net view 查阅网络上的可用计算机 ping 命令 一般情况下,用户可能通过使用一系列ping命令来查找问题出现在何处,或检验网络运行的情况,典型的检测次序及所对应的故障。 ping 127.0.0.1 如果测试成功,表明网卡,TCP/IP协议的安装和IP地址、子网掩码的设置正常。 如果测试不成功,则表示TCP/IP的安装或运行存在某些最基本的的问题。 PING 本地IP 如果测试不成功,则表示本地配置或安装存在问题,应当对网络设备和通介质进行测试、检查并排除故障。 PING 局域网内其他的IP 如果测试成功,表明本地网络中的网卡和网络电缆运行正确。但如果收到0个回送应答,那么表示子网掩码不正确或网卡配置错误或电缆有问题。 PING 网关IP 这个命令如果应答正确,表示局域网中的网关路由器正在运行并能做出应答。 PING 远程IP 如果收到正确应答,则表示成功地使用了默认网关;对于拨号上网用户,则表示能够成功地访问INTERNET。 ping localhost localhost 是系统的网络保留名,它是127.0.0.1的别名,每台计算机都能将该名字转换成该地址。如果没有做到这一转换,则表示主机文件(Windows/host)中存在问题。 ping https://www.360docs.net/doc/c03515091.html,(一个著名网站域名) 对此域名执行PING命令。计算机须先将域名转换成IP 地址,通常是通过DNS服务器。如果这里出现故障,则表示本机DNS服务器的IP地址配置不正确,或NDS服务器有故障。如果上面列出的所有PING命令都能正常运行机制,那么计算机进行本地和远程通信基本上就没有问题了。但是,这些命令的成功并不表示所有网络配置就没问题,例如,某些子网掩码错误就可能无法用这些方法检测到。 PING命令的常用参数选项如下。 PING IP 地址(如192.168.1.10)-T:连续对IP地址执行PING命令,直到被用户按Ctrl+C键中断。 ping IP 地址-1 2000:指定PING 命令国的数据长度为2000B,而不是默认的32 B。 PING IP地址-N:执行特定的确次PING命令。 netstat命令 netstat -s -s选项能够按照各个协议分别显示其统计数据。 netstat -a:显示所有连接和侦听端口。 netstat -e:显示关于以太网的统计数据。 netstat -r:显示关于路由表的信息。

C51几个预编译指令的用法

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

#en dif结束一个#if ......... #e条件编译块 #error 停止编译并显示错误信息 一、文件包含 #include 预处理指令的作用是在指令处展开被包含的文件。包含可以是多重的,也就是说一个被包含的文件中还可以包含其他文件。标准C编译器至少支 持八重嵌套包含。 预处理过程不检查在转换单元中是否已经包含了某个文件并阻止对它的多次包含。这样就可以在多次包含同一个头文件时,通过给定编译时的条件来达到不同的效果。例如: #define AAA #include "t.c" #undef AAA #include "t.c" 为了避免那些只能包含一次的头文件被多次包含,可以在头文件中用编译时条件来进行控制。例如: #ifndef MY_H #define MY_H #endif 在程序中包含头文件有两种格式: #include #include "my.h" 第一种方法是用尖括号把头文件括起来。这种格式告诉预处理程序在编译器自带的或外部库的头文件中搜索被包含的头文件。第二种方法是用双引号把头文件括起来。这

相关文档
最新文档