assert预处理宏与预处理变量

assert

assert是一个预处理宏,由预处理器管理而非编译器管理,所以使用时都不用命名空间声明,如果你写成std::assert反而是错的。使用assert需要包含cassert或assert.h,用法如下:

assert(expr)

assert主要用途是:用于调试,检测一些不应该出现的情况。如果expr为假(即为0),assert输出信息并终止程序的运行,如果expr为真,则什么也做。

assert的使用依赖于一个宏NDEBUG(No Debug),如果未定义NDEBUG则assert起作用,如果定义了NDEBUG则assert完全不起作用。所以用VS开发时,Debug编译时assert有效,Release编译时assert无效。

示例代码:

void test()
{
    int id = -2;
    assert(id >= 0);
}

一般ID是不会有负数的,于是我们用assert检测程序中的id是否有负数,如果id为负数,在Debug模式下运行会弹出以下警告框,在Release模式下运行会则什么也不发生。

这样做的好处是程序在调试时就能发现其中的错误。

**注:**assert应仅用于验证那些不可能发生的事情,而不能用它来代替真正的运行时逻辑检查,也不能代替程序本身应该包含的错误检查。

预处理变量

与assert类似,预处理器还定义了一些变量用于存放源代码的相关信息,这里只列举常用 的预处理变量:

FILE :源代码所在的路径和文件名;

LINE :代码所在的行号

FUNCTION:代码所在的函数的函数名

DATE :文件编译时的日期

TIME :文件编译时的时间

这些信息在调试和日志记录时非常有用,能准确定义错误所在的位置。

示例代码:

void test()
{
    cout << "in " << __FILE__ << " file, " << __LINE__ << " line " << endl;
    cout << "in " << __FUNCTION__ << " function." << endl;
    cout << "at " __DATE__ << " " << __TIME__ << endl;
}

在Debug模式下运行结果如下:

版权声明:本文为博主原创文章,未经博主允许不得用于任何商业用途,转载请注明出处。

时间: 2024-08-02 02:49:25

assert预处理宏与预处理变量的相关文章

C++中的预处理宏

C++中的预处理宏 一个预处理宏的例子: # define PRINT(STR,VAR) cout<<STR “ = “<<VAR<<endl; 跟在宏名后面的括号中的参数会被闭括号后面的所有代码替代.只要在调用宏的地方,预处理程序就删除名字PRINT并替换代码,所以使用宏名时编译器不会报告任何错误信息,它并不对参数做任何类型检查. 另一个例子: # define P(EX) cout<<#EX<< “:”<<EX<<en

VC 宏与预处理使用方法总结

目录(?) C/C++ 预定义宏^ C/C++ 预定义宏用途:诊断与调试输出^ CRT 和 C 标准库中的宏^ NULL 空指针^ limits.h 整数类型常量^ float.h 浮点类型常量^ math.h 数学常量^ EOF 常量^ errno.h 错误代码^ locale 类别^ _MAX_PATH 等文件名与路径长度限制^ RAND_MAX 随机数最大值^ va_arg/va_start/va_end 访问变长函数参数^ 宏实现的 CRT 函数^ Microsoft 预定义宏^ 平台与

C/C++ 中宏与预处理使用方法大全 (VC)

VC 中的宏使用方法参考 MSDN: Macros (C/C++) C/C++ 预定义宏^ __LINE__: 当前源文件的行号,整数__FILE__: 当前源文件名,char 字符串,使用 /FC 选项产生全路径__DATE__: 当前编译日期,char 字符串,格式 Aug 28 2011__TIME__: 当前编译时间,char 字符串,格式 06:43:59__STDC__: 整数 1,表示兼容 ANSI/ISO C 标准,配合 #if 使用__TIMESTAMP__: 最后一次修改当前

unity3d shader 预定义着色器预处理宏

编译着色器程序时,Unity 会定义几个预处理宏. 目标平台 SHADER_API_OPENGL - 桌面 OpenGL SHADER_API_D3D9 - Direct3D 9 SHADER_API_XBOX360 - Xbox 360 SHADER_API_PS3 - PlayStation 3 SHADER_API_D3D11 - 桌面 Direct3D 11 SHADER_API_GLES - OpenGL ES 2.0(桌面或移动),使用 SHADER_API_MOBILE 的存在来确

C 语言 之 预处理-------- 宏定义

1 概述 使用过以"#"号开头的预处理命令.如包含命令# include,宏定义命令# define等.在源程序中这些命令都放在函数之外, 而且一般都放在源文件的前面,它们称为预处理部分. 所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作.预处理是C语言的一个重要功能, 它由预处理程序负责完成.当对一个源文件进行编译时, 系统将自动引用预处理程序对源程序中的预处理部分作处理, 处理完毕自动进入对源程序的编译. C语言提供了多种预处理功能,如宏定义.文件包含. 条

VS中添加预处理宏的方法

VS中添加预处理宏的方法 除了在.c及.h中添加宏定义之外,还可以采用如下方法添加宏定义: 1.若只需要定义一个宏(如#define DEBUG),可以右键点击工程-->属性-->c/c++-->预处理器-->预处理器定义,点击下拉框中的编辑,输入想要定义的宏: 2.如果还需要定义宏的内容(如#define inline __inline),可以右键点击工程-->属性-->c/c++-->命令行,在其它选项中输入如下内容: /D"inline"

Shader预处理宏、内置状态变量、多版本编译等

预定义shader预处理宏: Target platform: SHADER_API_OPENGL - desktop OpenGL SHADER_API_D3D9 - Direct3D 9 SHADER_API_XBOX360 - Xbox 360 SHADER_API_PS3 - PlayStation 3 SHADER_API_D3D11 - desktop Direct3D 11 SHADER_API_GLES - OpenGL ES 2.0 (desktop or mobile), u

C/C++预处理宏的总结

1.定义顺序的无关性 #define PI 3.14 #define TWO_PI  2*PI 这两句谁前谁后无所谓,因为预处理器不断迭代来实现宏替换,直到源文件中没有宏了才停止. 2. 宏变量变成字符串 #define str(x)  #x 例子:str (teststring)  ==> "teststring" 3. 宏变量拼接 #define print(n)  printf("%d\n",x##n) 例子:print(20) ==> print

关于NOMINMAX这个预处理宏

标准库在<algorithm>头中定义了两个模板函数std::min() 和 std::max().通常用它可以计算某个值对的最小值和最大值.可惜在 Visual C++ 无法使用它们,因为没有定义这些函数模板.原因是名字min和max与<windows.h>中传统的min/max宏定义有冲突.为了解决这个问题,Visual C++ 定义了另外两个功能相同的模板:_cpp_min() 和 _cpp_max().我们可以用它们来代替std::min() 和 std::max().为了