免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6623 | 回复: 11

晕, cpp预处理这是那门子机制删文件啊? [复制链接]

论坛徽章:
0
发表于 2006-02-21 14:49 |显示全部楼层
写一个程序, 例如a.c, 里边用了宏, 宏在别的目录下的头文件中定义, 用-I指定。
调试时, 发现宏替换存在问题, 于是用cpp查看预处理输出, cpp也接受-I选项, 就象gcc一样。 于是, 故事开始了:

1, cpp -I ../headers/ a.c
问题是, 我一下子忘了敲那个-I选项了!! 于是事实上的命令就是这样:
cpp ../headers/ a.c
输出:cc1: error: headers/: 没有那个文件或目录

2, 我马上意识到自己的错误操作, 更正为:
cpp -I ../headers/ a.c
输出:
[root@localhost ~]# cpp -I ../headers/ a.c
cpp: a.c:没有那个文件或目录
cpp: 没有输入文件

嗯? a.c也不见了? 不可能啊。 ls一下, 嘿, 还真的不见了! 百思不得其解, 用strace跟踪一下cpp ../headers/ a.c,看看它都干了些什么:

3, strace cpp ../headers/ a.c
最后几行的输出:
vfork()                                 = 4450
waitpid(4450, cc1: error: headers/: 没有那个文件或目录
[{WIFEXITED(s) && WEXITSTATUS(s) == 1}], 0) = 4450
--- SIGCHLD (Child exited) @ 0 (0) ---
stat64("a.c", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
unlink("a.c")                           = 0
exit_group(1)                           = ?


我晕啊, 就算我没加-I, 也不能乱删我文件啊, 可怜我的源程序啊! :em10::em10:

[ 本帖最后由 albcamus 于 2006-2-21 14:55 编辑 ]

论坛徽章:
0
发表于 2006-02-21 15:21 |显示全部楼层
我想知道cpp这么做的理由是什么, 为什么第一个参数不存在, 就要无条件删除第二个? 郁闷

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2006-02-21 17:38 |显示全部楼层
这个你都不懂啊。
gcc -o a.c a
试一下。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2006-02-21 17:42 |显示全部楼层
  1. NAME
  2.        cpp - The C Preprocessor

  3. SYNOPSIS
  4.        cpp [-Dmacro[=defn]...] [-Umacro]
  5.            [-Idir...] [-Wwarn...]
  6.            [-M│-MM] [-MG] [-MF filename]
  7.            [-MP] [-MQ target...]
  8.            [-MT target...]
  9.            [-P] [-fno-working-directory]
  10.            [-x language] [-std=standard]
  11.            infile outfile

  12.        Only the most useful options are listed here; see below for the remain-
  13.        der.
复制代码

如果你不输入 -I 的话,那么第一个参数 ../headers/ 是输入文件,第二个参数 a.c 是输出文件。
这样你的文件就会被删除。
和 gcc -o ttt.c ttt 的原理一样,
请看“UNIX 痛恨者手册”,
类似的还有
  1. rm *.o
复制代码

因为 * 号需要按 shift 键,所以如果你的手指不太协调或者键盘不太灵光的话,
按后面的小数点的时候,也许 shift 还没有松开,
于是就变成了
  1. rm *>o
复制代码

恭喜你!
UNIX 将删除你所有的文件,并且为你生成一个名为 o 的空文件。

[ 本帖最后由 flw 于 2006-2-21 17:46 编辑 ]

论坛徽章:
0
发表于 2006-02-21 17:57 |显示全部楼层
> 如果你不输入 -I 的话,那么第一个参数 ../headers/ 是输入文件,第二个参数 a.c 是输出文件。
我晕! Unix痛恨者手册看过, 以前就被rm -rf害死过无数次了, 今天又碰上一个例子

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2006-02-21 22:05 |显示全部楼层
al* 又多了一篇精华

论坛徽章:
0
发表于 2006-02-22 08:54 |显示全部楼层
原帖由 flw 于 2006-2-21 22:05 发表
al* 又多了一篇精华


惭愧~不是很有技术含量的说~

论坛徽章:
1
NBA常规赛纪念章
日期:2015-05-04 22:32:03
发表于 2006-02-22 10:00 |显示全部楼层
某次,我把 
rm -rf *.xx
写成多了一个空格
rm -rf * xx
非常重要的视频数据给删了,害我又跑了一次深圳现场

论坛徽章:
0
发表于 2006-02-22 19:21 |显示全部楼层
可以把rm改稱mv --target-directory ~/Trash。
但CPP這種問題就沒辦法解決了,只能靠CVS,

论坛徽章:
0
发表于 2006-02-23 10:11 |显示全部楼层

The Unix Hater's Handbook!

恭喜你了,你跟本书作者联系,把这事告诉他,就可能在下一版中看到你的光辉事迹了。
http://research.microsoft.com/~daniel/uhh.pdf
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP