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 

#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, 请检查一下...

C/C++编译预处理指令:#error_第1张图片


二、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

你可能感兴趣的:(C/C++编译预处理命令知识,c语言,c++,开发语言)