课后的几个问题:
1) int x/*blah blah*/y;
会有什么问题?
答:编译器报错,语句中不应该有多行注释
单行注释也应该放到语句后面或者独自占一行.
2)打出下面一行字符串(包括引号)会出现什么问题.
"Blunder??!??"
答:在Xcode中不会出现问题.但是由于三字母词(trigrph)标准的存在.如果直接用编译命令 cc 则会出现以下警告:
$cc main.c
main.c:21:22: warning: trigraph ignored [-Wtrigraphs]
printf(""Blunder??!??" ");
^
1 warning generated.
编译器提示我们用忽略三字母词命令.
3、其他编译相关:
1)使用 gcc clang 会有同样的提示.因为三字母词(trigrph)是C的一个标准.
2)使用命令 $gcc main.c 会有一个 a.out 的可执行文件生成.和在Xcode 的控制台输出是一样的.
3)使用命令 $clang -o demo main.c 的话给可执行文件一个指定的名字demo.
4)使用 -Wall 编译选项 打印编译过程中的所有警告信息 编译选项区分大小写(-Wall 不能是 -wall)
$ cc -Wall -o demo main.c main.c:12:9: warning: unused variable 'i' [-Wunused-variable] int i; /* loop counter */ ^ main.c:21:22: warning: trigraph ignored [-Wtrigraphs] printf(""Blunder??!??" "); ^ main.c:22:9: warning: unused variable 'xy' [-Wunused-variable] int xy; ^ 3 warnings generated.
5)使用-E 编译选项 只输出预编译结果 编译选项区分大小写(-E 不能是 -e)
源文件同步目录下会生成一个 demo 的文本文件
$clang -E main.c > main.i
# 1 "main.c" # 1 "<built-in>" 1 # 1 "<built-in>" 3 # 361 "<built-in>" 3 # 1 "<command line>" 1 # 1 "<built-in>" 2 # 1 "main.c" 2 .....
6)使用 -S 编译选项 输出汇编代码
$clang -S main.c > main.s
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
.section __TEXT,__text,regular,pure_instructions .build_version macos, 10, 14 .globl _squares ## -- Begin function squares .p2align 4, 0x90 _squares: ## @squares .cfi_startproc ## %bb.0: pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset %rbp, -16 movq %rsp, %rbp .cfi_def_cfa_register %rbp movl %edi, -4(%rbp) popq %rbp retq .cfi_endproc ## -- End function .globl _main ## -- Begin function main .p2align 4, 0x90 _main: ## @main .cfi_startproc ## %bb.0: pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset %rbp, -16 movq %rsp, %rbp .cfi_def_cfa_register %rbp subq $32, %rsp leaq L_.str(%rip), %rax movl $0, -4(%rbp) movl %edi, -8(%rbp) movq %rsi, -16(%rbp) movq %rax, %rdi movb $0, %al callq _printf xorl %ecx, %ecx movl %eax, -24(%rbp) ## 4-byte Spill movl %ecx, %eax addq $32, %rsp popq %rbp retq .cfi_endproc ## -- End function .section __TEXT,__cstring,cstring_literals L_.str: ## @.str .asciz ""Blunder??!??" " .subsections_via_symbols
此外还有一些编译选项:
7)使用 -save-temps 编译选项 输出所有中间代码
$clang -save-temps main.c
同级目录下会出现:
a.out
main.bc
main.i
main.o
main.s
8)使用 -l 编译选项 链接共享库
#clang -Wall main.c -o main -lFileName
9)使用 -fPIC 编译选项 创建独立的(无关联的)地址信息代码
能够快速的定位错误地址.尤其是使用动态链接库时.
$clang -c -Wall -Werror -fPIC Cfile.c
10)-v
11)-ansi 支持ISO C89 programs
12)-funsigned-char 选项将char类型解释为 unsigned char 类型.
13)-fsigned-char 将unsigned char类型解释为char 类型.
14)-D 开启编译时的宏.