C/C++编译预处理指令:#error

目录

前言

一、#error有什么作用?

二、assert.h官方库对#error的使用

总结


前言

         今天突发奇想,阅读一下C库头文件,打开了assert.h一看,很好!第一句就看不懂,于是有了这一篇,这里有很多#开头的编译预处理指令,今天先学习一下: #error 。

//
// assert.h
//
//      Copyright (c) Microsoft Corporation. All rights reserved.
//
// Defines the assert macro and related functionality.
//
#if defined _VCRT_BUILD && !defined _ASSERT_OK
    #error assert.h not for CRT internal use
#endif

#include <corecrt.h>

#pragma warning(push)
#pragma warning(disable: _UCRT_DISABLED_WARNINGS)
_UCRT_DISABLE_CLANG_WARNINGS

_CRT_BEGIN_C_HEADER



#undef assert

#ifdef NDEBUG

    #define assert(expression) ((void)0)

#else

    _ACRTIMP void __cdecl _wassert(
        _In_z_ wchar_t const* _Message,
        _In_z_ wchar_t const* _File,
        _In_   unsigned       _Line
        );

    #define assert(expression) (void)(                                                       \
            (!!(expression)) ||                                                              \
            (_wassert(_CRT_WIDE(#expression), _CRT_WIDE(__FILE__), (unsigned)(__LINE__)), 0) \
        )

#endif



_CRT_END_C_HEADER
_UCRT_RESTORE_CLANG_WARNINGS
#pragma warning(pop) // _UCRT_DISABLED_WARNINGS

一、#error有什么作用?

    当编译器遇到这一句时,就会停止编译并输出对应的提示信息。一般用在头文件中,而且配合条件编译使用,比如:

#pragma once
#include "MyIncludeFiles.h"

//假设一个条件,如果定义了 ERROR_TEST 为 0 才能编译通过
#define ERROR_TEST 1

#if (0 != ERROR_TEST)
    #error 这是错误提示信息,错误原因是 ERROR_TEST 不等于 0, 请检查一下...
#endif

如上所示的代码段,编译后会有这样的输出提示:

** fatal error C1189: #error:  这是错误提示信息,错误原因是 ERROR_TEST 不等于 0, 请检查一下...


二、assert.h官方库对#error的使用

#if defined _VCRT_BUILD && !defined _ASSERT_OK
    #error assert.h not for CRT internal use
#endif

  翻译一下,就是说,如果定义了 _VCRT_BUILD 这个宏,同时没有定义 _ASSERT_OK 这个宏,那么在编译到这里的时候,就提示编译出错,错误提示信息是:assert.h not for CRT internal use;意思是:assert.h 不供 CRT 内部使用。


总结

  以上,当我们在自己编写头文件,而又需要依赖某些前置条件的宏定义的时候,就可以用这个#error来实现错误提示了。再比如呢,可以这样用:

//一般情况下,My_HeadFiles.h 头文件可能都会这么写,以避免重复定义
#ifndef MY_HEADFILES_H_
#define MY_HEADFILES_H_

#endif //MY_HEADFILES_H_

---------------------------------------------------

//我们新增的.c/.h文件需要依赖于My_HeadFiles.h文件,那么就可以这样:
#ifndef MY_HEADFILES_H_
  #error 朋友!你可能忘记包含My_HeadFiles.h文件啦!或者应该先包含它,快去看看~
#endif

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小半趣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值