编译 & 预处理

编译(compilation , compile)

1、利用编译程序从源语言编写的源程序产生目标程序的过程。

2、用编译程序产生目标程序的动作。 编译就是把高级语言变成计算机可以识别的2进制语言,计算机只认识1和0,编译程序把人们熟悉的语言换成2进制的。

  编译程序把一个源程序翻译成目标程序的工作过程分为五个阶段:词法分析;语法分析;语义检查和中间代码生成;代码优化;目标代码生成。主要是进行词法分析和语法分析,又称为源程序分析,分析过程中发现有语法错误,给出提示信息。

 

预处理(pre-treatment)

  定义:指在进行最后加工完善以前进行的准备过程,具体应用在不同的行业或领域,会有不同的解释。

预处理中会展开以#起始的行,试图解释为预处理指令(preprocessing directive)

  C/C++要求支持的包括#if/#ifdef/#ifndef/#else/#elif/#endif(条件编译)、#define(宏定义)、#include(源文件包含)、#line(行控制)、#error(错误指令)、#pragma(和实现相关的杂注)以及单独的#(空指令)。预处理指令一般被用来使源代码在不同的执行环境中被方便的修改或者编译。

 

================

1、使用#error和#pragma

  • 使用#error

  • #if A_SIZE < B_SIZE

  •  #error  "Incompatible sizes"

  • #endif

  •  

  • 使用#pragma

  • #pragma    tokens

 

 

2、预处理指令

  • 条件编译

  • #if        constant_integral_expression

  • #ifdef     identifier

  • #endif     identifier

  • .

  • #undef     identifier

  • .

  • #if    0

  •  more statements

  • #endif

  •  and still more statements

  • .

  • // 等于else if(if-else结构)

  • #elif      constant_integral_expression

  • #else      ...

  • #endif     ...

  • .

  • 自定义NSLog

  • ex 1:

  • // 有DEBUG这个宏,代表需要显示Log;没有时,不需要显示Log

  • #ifdef     DEBUG
    
    
    
    #define    MBLog(...)  NSLog(__VA_ARGS__)
    
    
    
    #else
    
    
    
    #define    MBLog(...)
    
    
    
    #endif
  • .

  • ex 2:

  • #defind    DEBUG   1
    
    
    
    #if        DEBUG
    
    
    
        printf      ("debug: a = %d \n", a);
    
    
    
    #endif
  • .

  • ex 3:

  • ...

  • #undef     PIE
    
    
    
    #define    PIE     "I like apple."
  • ...

  • "#" 和 "##" 的使用

  • // "#"操作符,使参数被一对‘双引号’所包围!

  • // "#"使宏定义中的一个形式参数“字符串化” --> 相当于函数“传值”

  • .

  • #define    message_for(a, b)   \
    
    
    
             printf(#a " and " #b ": We love you! \n")
    
    
    
    int main(void)
    
    
    
    {
    
    
    
     message_for(Carole, Debra);
    
    
    
     return 0;
    
    
    
    }
    
    
    
    int main(void)
    
    
    
    {
    
    
    
     printf("Carole" " and " "Debra" ": We love you! \n");
    
    
    
     return 0;
    
    
    
    }
  • // " "被空格连接,自动拼接上去,即:Carole and Debra: We love you!

  • .

  • .

  • // 双目操作符"##",用于合并标记
    
    
    
    #define    X(i)  x ## i
    
    
    
    X(1) = X(2) = X(3);
    
    
    
    // 预处理后
    
    
    
    x1 = x2 = x3;
  • 导入系统中的命令行“clear”

int system(const char * string);



int main()

{

  system("clear");



  return 0;

}

 

 

3、注释

  • 使用 #error、#program、#wrong

  • #if A_SIZE < B_SIZE

  •  #error  "Incompatible sizes"

  • #endif

  • .

  • .

  • #program marks - "Messages."      将方法分开(中间一根线)

  • #program mark "Messages."         未分,只为了方便查找

  • .

  • .

  • #wrong "Messages."

  •  

  • 各种注释方式

  • 0 |--> iOS编码中 <--|

  • .

    1/// 和 /*...*/ 都是文件注释
    
    
    
    .
    Swift中注释:
    2// MARK: 注释 3// TODO: 子注释 4// FIXME: 提示修改 . 5// !!!: 提示 6// ???: 提示
  • .

  • .

  • 7、|--> 网页编码中 <--|

  • .

  • 7.1 注释标签用于在源文档中插入注释,注释会被浏览器忽略

  • .<!--

  • .#info {

  • .   "Message."

  • .}

  • .-->

  • 7.2 比较

  • .<!-- comment 会包含在最终生成的html文件中 -->

  • .<%-- comment 则不会包含 --%>

  • .

  • .

  • 8、|--> Terminal脚步编码 <--|

  • .

  • 8.1 # Unix风格单行注释

  • .

  • 8.2 " 终端配置时,注释

  •  

 

================

PS:

[ 每日一句 

人生有两条路,一条需要用心走,叫做梦想;一条需要用脚走,叫做现实

 

[ 每天一首英文歌 ]

" Roar " - Katy Perry

================

 

|-> GitHub: SpongeBob-GitHub

|--> Copyright (c) 2015 Bing Ma.

你可能感兴趣的:(编译)