我是靠谱客的博主 美好钢笔,最近开发中收集的这篇文章主要介绍C/C++编译预处理指令:#error前言一、#error有什么作用?二、assert.h官方库对#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
最后
以上就是美好钢笔为你收集整理的C/C++编译预处理指令:#error前言一、#error有什么作用?二、assert.h官方库对#error的使用总结的全部内容,希望文章能够帮你解决C/C++编译预处理指令:#error前言一、#error有什么作用?二、assert.h官方库对#error的使用总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复