C语言进阶--#error和#line分析

Posted 袁帅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言进阶--#error和#line分析相关的知识,希望对你有一定的参考价值。

#error用于生成一个编译错误消息

用法:#error message 

--message不需要用双引号包围

#error编译指示符用于自定义程序员特有的编译错误消息,#error是一种预编译器指示符,可用于提示编译条件是否满足

 ifndef _cplusplus

  #error This file should be processed with C++ compiler.

#endif

--编译过程中的任意错误信息意味着无法生成最终的可执行程序

类似的,#warning用于生成编译警告

 

#line用于强制指定新的行号和编译文件名,并对源程序的代码重新编号

#line number filename

filename可以省略

#line编译指示符的本质是重定义_LINE_和_FILE_

 

第23课 #error和#line使用分析

#error的用法:

技术分享图片

技术分享图片

 

示例程序:

 1 #include <stdio.h>
 2 
 3 #ifndef __cplusplus
 4     #error This file should be processed with C++ compiler.
 5 #endif
 6 
 7 class CppClass
 8 {
 9 private:
10     int m_value;
11 public:
12     CppClass()
13     {
14         
15     }
16     
17     ~CppClass()
18     {
19     }
20 };
21 
22 int main()
23 {
24     return 0;
25 }

先注释掉3-5行的代码,使用gcc编译结果如下:

技术分享图片

 

当出现这样的编译错误后不一定是我们的代码错了,可能是我们的编译器用错了。比如我们使用了开源代码或者第三方库经常会出现这样的错误。这样的错误我们不好定位,甚至看不懂这样的错误信息,这时我们只需要加上第3-5行的代码,然后再进行编译。

加上3-5行的程序后,gcc编译结果如下:

技术分享图片

 

 

#error在条件编译中的应用:

 1 #include <stdio.h>
 2 
 3 void f()
 4 {
 5 #if ( PRODUCT == 1 )
 6     printf("This is a low level product!
");
 7 #elif ( PRODUCT == 2 )
 8     printf("This is a middle level product!
");
 9 #elif ( PRODUCT == 3 )
10     printf("This is a high level product!
");
11 #endif
12 }
13 
14 int main()
15 {
16     f();
17     
18     printf("1. Query Information.
");
19     printf("2. Record Information.
");
20     printf("3. Delete Information.
");
21 
22 #if ( PRODUCT == 1 )
23     printf("4. Exit.
");
24 #elif ( PRODUCT == 2 )
25     printf("4. High Level Query.
");
26     printf("5. Exit.
");
27 #elif ( PRODUCT == 3 )
28     printf("4. High Level Query.
");
29     printf("5. Mannul Service.
");
30     printf("6. Exit.
");
31 #endif
32     
33     return 0;
34 }

我们在编译的时候如果忘记了定义PRODUCT宏,也可以编译通过,但运行结果不是我们想要的,我们希望在没有定义PRODUCT宏的时候,程序编译报错。

我们修改程序,加入#error编译错误信息:

技术分享图片

 

当我们不定义PRODUCT宏直接编译时,结果如下:

技术分享图片

 

这正是我们想要的结果。

 

#line的用法

技术分享图片

 

#line在现代编译器中基本不再使用了。

 使用示例:技术分享图片

 

以前的程序由多人开发,而且都写在一个文件中,出现编译错误时不知道是谁的程序出错了,所以引入了#line。

 小结:

技术分享图片

以上是关于C语言进阶--#error和#line分析的主要内容,如果未能解决你的问题,请参考以下文章

第23课 #error 和 #line 使用分析

C之 #error 和 #line(二十一)

我的C/C++语言学习进阶之旅解决使用ninja命令的时候报错:ninja: error: loading ‘build.ninja‘: 系统找不到指定的文件。

我的C/C++语言学习进阶之旅解决使用ninja命令的时候报错:ninja: error: loading ‘build.ninja‘: 系统找不到指定的文件。

我的C/C++语言学习进阶之旅解决使用ninja命令的时候报错:ninja: error: loading ‘build.ninja‘: 系统找不到指定的文件。

C语言进阶指针的进阶