程序环境和预处理的基本认识

我们通常都是在集成开发环境(IDE)下编写程序,通过IDE中编译器,链接器,调试器,加载器,最后形成了一个可执行文件。

我们需要更详细的了解该过程是怎么实现的,我们就需要在Linux系统下认识。

Linux中一些简单指令:

ls  ----    列出当前文件夹的所以文件                       cd  ----  更改(切换)目录   

mkdir   -----  创建目录(文件夹)                            rm -R   ---- 删除目录文件(文件内有内容)

touch  ---- 创建文件                                                   pwd -----  打印当前工作目录      

gedit  ----   编译器                                                      gcc   ----- 编译        

   ..................

通过一些简单的指令,我们可以查看“预处理”,“编译”,“汇编”,“链接”各阶段文件的内容。

1.预处理      ( gcc -E test.c -o test.i)

[admin@localhost class]$ touch test.c

[admin@localhost class]$ gedit test.c

[admin@localhost class]$ gcc test.c

[admin@localhost class]$ ll
total 12
-rwxrwxr-x. 1 admin admin 4642 Oct 21 13:55 a.out
-rw-rw-r--. 1 admin admin   69 Oct 21 13:54 test.c
-rw-rw-r--. 1 admin admin    0 Oct 21 13:53 test.c~
[admin@localhost class]$ ./a.out
hello linux!
[admin@localhost class]$ gcc -E test.c -o test.i

[admin@www class]$ gedit test.i


如上我们可以看到,通过 gcc -E test.c -o test.i ,可以看到预处理中宏替换,注释的去除,条件编译的实现。

2.编译 (该过程中,把C语言翻译成汇编语言)     (gcc -S test.i -o test.s)

[admin@localhost class]$ gcc -S test.i -o test.s

[admin@www class]$ gedit test.s


3.汇编  (该过程把汇编语言翻译成二进制语言) ( gcc -c test.s -o test.o)

[admin@localhost class]$ gcc -c test.s -o test.o

二进制文本需要库来打开,有兴趣的可以去查查怎么打开二进制文本。

4.链接(目标文件和链接库,链接形成可执行文件)

以上就是在Linux下实现程序如何变成可执行文件的。希望对大家了解C语言程序环境有所帮助。


在C语言中,有几个为系统默认的预定义符号,即使你使用#ifdef 来重新定义,它还是会维持它系统默认的值。

               __FILE__               当前编译的源文件

               __LINE__                当前__LINE__所在的行号

               __DATE__               文件被编译的时间(日期)

               __TIME__                 文件被编译的时间(时分秒)

        


# 和 ##  的功能:

#:可以把一个宏中的参数变成字符串     
##:可以把位与它两边的两个符号合并为一个符号


宏和函数的区别:
1.在使用宏和函数中,使用宏的运行速度比较快
2.宏定义时,不会考虑参数的类型,函数的参数不可以出现类型
3.函数的参数存在传值,传地址,宏不存在
4.每次使用宏,宏定义的代码都会插入程序中,大大的增加了程序的长度
5.宏不能调试

写一个宏可以将一个数字的奇数位和偶数位交换。 
#define _CRT_SECURE_NO_WARNINGS 
#define SWAP(m)\
         (((m&(0x55555555))<<1)|((m&(0xAAAAAAAA))>>1))


#include<stdio.h>
#include<stdlib.h>
int main()
{

int m = 5;
        printf("奇数位和偶数位交换后:%d\n",SWAP(m));
system("pause");
return 0;
}









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值