C和C指针小记(二)-注释,三字母词,编译选项

课后的几个问题:

1) int x/*blah blah*/y;

会有什么问题?

答:编译器报错,语句中不应该有多行注释

单行注释也应该放到语句后面或者独自占一行.

2)打出下面一行字符串(包括引号)会出现什么问题.

"Blunder??!??"

答:在Xcode中不会出现问题.但是由于三字母词(trigrph)标准的存在.如果直接用编译命令 cc 则会出现以下警告:

$cc main.c

main.c:21:22: warning: trigraph ignored [-Wtrigraphs]

    printf("\"Blunder??!??\"\n");

                     ^

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??!??\"\n");
                     ^
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

    .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??!??\"\n"


.subsections_via_symbols
View Code

 

此外还有一些编译选项:

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 开启编译时的宏.

 

 

 

   

posted @ 2019-02-13 15:15  wjwdive  阅读(229)  评论(0编辑  收藏  举报