#line 的作用是改变当前行数和文件名称,它们是在编译程序中预先定义的标识符命令的基本形式如下:

#line number["filename"]

其中[]内的文件名可以省略。例如:

#line 30 a.h //其中,文件名a.h 可以省略不写。

这条指令可以改变当前的行号和文件名,例如上面的这条预处理指令就可以改变当前的行号为30,文件名是a.h。初看起来似乎没有什么用,不过,他还是有点用的,那就是用在编译器的编写中,我们知道编译器对C 源码编译过程中会产生一些中间文件,通过这条指令,可以保证文件名是固定的,不会被这些中间文件代替,有利于进行分析。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>#define pi 3.14
#undef piint a = 0;void show(){a++;printf("hello: %d\n",a);
}void main(int *argv, char *args[]){/**__DATE__, __TIME__ */printf("current line number %d ,current file %s:%s\n",__LINE__,__FILE__, __FUNCTION__);#line 10 "Demo_01_pointer_ifdef_enum.c"printf("current line number %d ,current file %s\n",__LINE__,__FILE__);}

编译与运行:

-bash-4.1$ gcc -o a Demo_06_#line__LINE__FILE__FUNCTION__TIME__DATA__.c
-bash-4.1$ ./a
current line number 20 ,current file Demo_06_#line__LINE__FILE__FUNCTION__TIME__DATA__.c:main
current line number 10 ,current file Demo_01_pointer_ifdef_enum.c

#error

如果程序中有#error这个预处理指令,那么程序在编译阶段就会直接报错:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>#define PI 3.14
#undef piint a = 0;void show(){a++;printf("hello: %d\n",a);
}void main(int *argv, char *args[]){#ifndef PI
#error First include then compile
#else show();
#endif#ifdef pi
#error pi was defined
#else
#error pi wasnt defined
#endif
}

编译:

-bash-4.1$ gcc -o a Demo_07_#error.c
Demo_07_#error.c:26:2: 错误:#error pi wasnt defined
-bash-4.1$

C语言预处理#line、#error相关推荐

  1. C语言预处理指令#error

      在FreeRTOS的FreeRTOS.h文件中看到一句代码 #ifndef configMINIMAL_STACK_SIZE#error Missing definition: configMIN ...

  2. stm32中c语言换行符error——expect a declaration warning——“\“followed by white space is not a line splic

    标题 stm32中c语言换行符error--expect a declaration warning--""followed by white space is not a lin ...

  3. 基于C99规范,最全C语言预处理知识总结

    基于C99规范,最全C语言预处理知识总结 00. 前言 1. 语法形式 2. 描述 3. 约束 4. 语义 01. 条件包含 01.1 关于`defined` 01.2 关于`#if/#elif/#e ...

  4. C语言预处理指令大全

    C语言预处理指令 文章目录 C语言预处理指令 define 语法 Linux编译时指定宏的值及宏 删除已有的宏 C语言允许多参数的宏及宏函数 宏函数需要注意的事项 参数宏创建字符串 预处理粘合剂 li ...

  5. c语言编译预处理指令大全,C语言预处理指令

    「今天是学习C语言第 32 天」 当你选择了一种语言,意味着你还选择了一组技术.一个社区.--Joshua Bloch # 预处理 C语言源程序先经过预处理器进行预处理,之后经过编译器编译成二进制可执 ...

  6. c语言预处理和连接区别,C语言预处理运算符

    预处理还需要运算符?有没有搞错? ^_^, 没有搞错,预处理是有运算符,而且还不止一个: #(单井号)    -- 字符串化运算符. ##(双井号 )-- 连接运算符 #@               ...

  7. R语言问题解决:Error: Discrete value supplied to continuous scale

    R语言问题解决:Error: Discrete value supplied to continuous scale #仿真数据 set.seed(123) my_df1 <- data.fra ...

  8. c语言----预处理

    c语言----预处理 宏 不带参数的宏 带参数的宏 头文件 条件编译 #if 命令 #else 与#elif #ifdef及#ifndef命令 #progma命令 预定义宏名 宏 不带参数的宏 宏定义 ...

  9. c++ 预处理命令 #error 用法

    预处理命令 #error 用法 #error #error 语法: #error message #error命令可以简单的使编译器在发生错误时停止. 当遇到一个#error时,编译器会自动输出行号而 ...

最新文章

  1. Split in Java
  2. “Survey of machine learning techniques for malware analysis ”
  3. poj3074(数独)
  4. ISAPI_Rewrite 规则说明
  5. VUE 项目中引入 json 配置
  6. Telnet 网络设备分页
  7. MATLAB 创建不定长数组
  8. 构建自己的NSZombie
  9. mysql数据库多表查询实例
  10. 国人创造中文编程语言的优势
  11. C#工厂模式——简单工厂、工厂方法、反射+简单工厂、抽象工厂
  12. [C0] 人工智能大师访谈 by 吴恩达
  13. 开源中国众包平台 —— 为什么我们需要托管赏金
  14. 格兰杰因果关系检验的局限性
  15. 从零开始学android:环境搭建
  16. 最好的 6 个免费天气 API 接口对比测评
  17. 微信领取淘宝内部优惠券教程免费
  18. Pyecharts绘制阶梯图
  19. 电商用户评论情感分析
  20. ERP系统方案的实施步骤

热门文章

  1. CentOS操作记录
  2. python D40 以及多表查询
  3. 迅雷精简版-纪念走过的时光
  4. linux 环境下的进程间的通信——消息队列传输结构体
  5. [我的理解]Javascript的原型与原型链
  6. Android中libs目录下armeabi和armeabi-v7a的区别
  7. Codeforces 343D Water Tree(DFS序 + 线段树)
  8. 使用纯代码进行界面布局
  9. [译]Code First基础
  10. php zrem,Redis Zrem 命令