[C语言]在命令行编译执行程序
-----------------------------------------------------------------------------------------
【开始】
1. 在Mac和Linux上写C语言之前,首先要看看是否安装了编译器:
在终端下输入gcc后回车进行检测,如果安装过,将提示 clang: error: no input files(没有输入文件);
如果没有安装,在Mac下根据提示安装Xcode即可,或者Install gcc without xcode in maxOsX:http://osxdaily.com/2012/07/06/install-gcc-without-xcode-in-mac-os-x/ ( OSX命令行工具下载:https://developer.apple.com/downloads/ )
在CentOS下直接yum -y install gcc gcc-c++(-y表示将自动选择y)
2. 现在开始愉快的写代码:
在Xcode里对新建的项目文件使用command+R就直接编译运行你的c代码了。
在Mac终端下,使用神器vim,如:vim test.c ,它不会帮你新建test.c,写完c代码后你需要command+s保存,然后:wq!退出,使用命令gcc test.c编译,不指定编译后的文件名,编译文件名都将是a.out ,运行它使用./a.out
在Linux下,同样使用vim,输入vim test.c 的时候就在当前目录新建了test.c文件,写完c代码直接:wq!保存退出,使用gcc test.c编译,运行编译文件./a.out ( gcc -o main.c main.o #生成.o文件 )
Sublime Text是一款值得使用的文本编辑器,如果装好环境,使用cmd+B对代码进行编译,shift+cmd+B运行,但是Sublime只能运行一个程序,如果需要运行有输入的程序,就必须离开Sublime进入到终端。
Windows环境下C/C++集成开发环境(IDE)推荐Dev-C++,这里不作过多介绍,下载地址在这里:http://sourceforge.net/projects/orwelldevcpp/?source=directory。
3. DEMO:
#include "stdio.h"
/*
标准输入流:键盘输入
标准输出流:终端输出
标准错误流:错误输出
stdin
stdout
stderr
*/
int main()
{
printf("nihao,shijie! \n"); //nihao, shijie
//内部实现:fprintf(stdout, "输入一个数:"); int a;
scanf("%d", &a);
//内部实现:fscanf(stdin, "%d", &a); if(a < 0) {
fprintf(stderr, "be sure: a > 0\n");
return 1;
} else {
printf("a > 0\n");
}
return ;
}
重定向: ./main.out >> m.txt #执行文件输出结果追加写入到m.txt
./main.out > m.txt #执行文件输出结果覆盖写入到m.txt
./main.out < input.txt #输入流重定向,input.txt作为输入流
./main.out >t.txt >f.txt < input.txt #输出流写入t.txt, 错误流写入f.txt, 输入流使用input.txt
管道: ls /usr/local/ | grep bin
ps -e | grep ssh #将前一条命令的输出流作为后面命令的输入流
附:
【C语言编译过程】
假如要编译一个 1.c 程序为可执行文件 build,如何看到编译器的处理过程呢,使用 gcc -v -o build 1.c
1. 预处理
cpp -o 1.i 1.c # 翻译成.i文件
gcc -E
2. 编译,系统用的是cc1
/usr/lib/gcc/x86_64-linux-gnu/4.8/cc1 -o build 1.c
我们可以直接用 gcc -S , 相当于帮我们执行上面的过程;
3. 汇编,系统用的是as
as -o build 1.c
我们可以直接用 gcc -c ,因为系统没有办法直接把c程序转为汇编,所以相当于依次执行了编译和汇编;
4. 链接,系统用的是collect2
/usr/lib/gcc/x86_64-linux-gnu/4.8/collect2 -o build 1.c
我们可以直接用 gcc -o ,同理,系统帮我们依次执行了编译、汇编、链接。
示例:
gcc -E -o 1.i 1.c # 生成预处理文件1.i,将其中的include和define等替换成其它
gcc -S -o 1.s 1.c # 编译成1.s 汇编码文件,-o选项不能省,只是增加了-S选项
gcc -c -o 1.o 1.c # 编译成1.o 二进制码文件,给机器读
由于include和define是预处理阶段完成的替换,所以它们并不是关键字,关键字是编译器处理的。
( 条件预处理 )
gcc -DABC 相当于 #define ABC , 用于调试中。
示例:
include <stdio.h> int main()
{
#ifdef ABC
printf("%s", __FILE__);
#endif printf("hello"); return ;
}
编译时,gcc -DABC -o build 1.c ,-D选项后面直接加常量名,预处理会加入宏定义。
不用命令行定义 ARRAY_SIZE 时,值为3:
#include <stdio.h> int main()
{
#ifndef ARRAY_SIZE
#define ARRAY_SIZE 3
#endif int array[ARRAY_SIZE] = {}; printf("ARRAY_SIZE is %d\n", ARRAY_SIZE);
perror("error msg"); return ;
}
gcc -o build 1.c -DARRAY_SIZE=2
( 宏展开下的#, ## )
# 字符串化
## 连接符号
#define ABC(x) #x // 宏体相当于字符串x,在宏中想赋值字符串的时候使用
#define ABC(x) day##x // 宏体相当于day连接x后的内容
示例:
include <stdio.h> #define FUNC(x) #x
#define PAR(x) myparam##x int main()
{
int myparam1 = ;
int myparam2 = ; printf(FUNC(abc\n)); // 输出abc\n printf(PAR()); // 输出10 printf(PAR()); // 输出20 return ;
}
例2:内核中用例,传入不同的后缀可以得到不同的值
#define ADM8211_SRAM(x) (priv->pdev->revision < ADM8211_REV_DB ? \
ADM8211_SRAM_A_ ## x : ADM8211_SRAM_B_ ## x) #define ADM8211_SRAM_INDIV_KEY 0x0000
#define ADM8211_SRAM_A_SHARE_KEY 0x0160
#define ADM8211_SRAM_B_SHARE_KEY 0x00c0 #define ADM8211_SRAM_A_SSID 0x0180
#define ADM8211_SRAM_B_SSID 0x00d4
Linux 下我们用man可以看到完整的手册,如果想看一些常用选项,建议你用 `gcc --help`:
Link: http://www.cnblogs.com/farwish/p/4162182.html
最新文章
- HTTP返回码中301与302的区别 (转载)
- Map工具系列-02-数据迁移工具使用说明
- 理解JavaScript中的参数传递 - leetcode189. Rotate Array
- AppleWatch___学习笔记(一)开发思路和框架
- Java程序员从笨鸟到菜鸟之(二十一)java过滤器和监听器详解 【转】
- ajax基本用法
- Android 点击文字实现跳转
- html5 的<;audio>; 音频 audio的“坑”
- (qsf文件 、 tcl文件 和 csv(txt)文件的区别) FPGA管脚分配文件保存、导入导出方法
- 20160322 javaweb 之jdbc-- mysql 批处理
- 微信小程序数据请求方法wx.request小测试
- BZOJ 1483: [HNOI2009]梦幻布丁 [链表启发式合并]
- (3)Deep Learning之神经网络和反向传播算法
- 如果想让某个块状元素右对齐,脑子里不要就一个float:right,很多时候,margin-left:auto才是最佳的实践
- etcd集群的搭建
- TCP/IP 最常见的错误原因码 (errno)列表
- 通过mysqlclient操作MySQL数据库
- Jaguar_websocket结合Flutter搭建简单聊天室
- node V8 的垃圾回收机制
- Stop单个Coroutine
热门文章
- 00007 - Linux时间date命令详解
- 非mapreduce生成Hfile,然后导入hbase当中
- 使用命名管道的OVERLAPPED方式实现非阻塞模式编程 .
- CS229 6.9 Neurons Networks softmax regression
- CS229 5.用正则化(Regularization)来解决过拟合
- Java之24种设计模式-UML-模型图解读
- django总结 --》内容(django建project开始的大致流程、ORM简介)
- android_自定义布局例子
- uiautomator2.0的配置的两种方法
- mysql5.7-windows安装配置