BACnet device对象详解以及协议栈相关代码

2024-03-14 06:12

本文主要是介绍BACnet device对象详解以及协议栈相关代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • BACnet 设备对象device详细介绍和应用场景
    • BACnet设备对象类型及其相关的函数
    • 查找BACnet设备对象类型的辅助函数
    • 获取特定对象类型的特殊属性列表Device_Objects_Property_List
    • 处理BACnet协议中的写属性操作 Device_Write_Property_Local
    • 处理BACnet协议中的读属性操作 Device_Read_Property_Local

BACnet 设备对象device详细介绍和应用场景

BACnet(Building Automation and Control Networks)是一种用于建筑自动化和控制系统的通信协议。BACnet设备对象是BACnet协议中的一个重要概念,用于表示建筑自动化系统中的设备。

BACnet设备对象(Device Object)是BACnet网络中的主要实体,代表了一个物理设备或网络上的虚拟设备。每个BACnet设备对象都有一个唯一的标识符,称为设备实例号(Device Instance)。

BACnet设备对象具有以下属性:

设备标识(Device Identifier):一个唯一的标识符,用于区分BACnet网络中的不同设备。

设备类型(Device Type):指定设备的类型,例如控制器、传感器、执行器等。

设备名称(Device Name):设备的人类可读名称,用于标识设备。

设备描述(Description):对设备的描述信息,用于提供有关设备的详细说明。

系统状态(System Status):表示设备当前的状态,例如正常、故障、离线等。

支持的对象类型(Supported Object Types):列出设备支持的其他BACnet对象类型,例如输入对象、输出对象、变量对象等。

BACnet设备对象的主要应用场景是建筑自动化和控制系统,其中包括楼宇管理系统、智能家居系统、工业控制系统等。通过BACnet设备对象,可以实现以下功能:

监测和控制:BACnet设备对象允许监测和控制建筑自动化系统中的各种设备,例如传感器、执行器、控制器等。通过读取和写入设备对象的属性,可以获取传感器的测量值、控制执行器的操作等。

系统管理:BACnet设备对象提供了管理设备和网络的功能。可以通过设备对象的属性设置设备的参数、配置网络设置、监控设备状态等。

通信和集成:BACnet设备对象作为BACnet网络中的实体,可以与其他设备进行通信和集成。通过BACnet协议的通信机制,设备对象之间可以交换数据、发送命令和通知等。

事件和报警:BACnet设备对象可以生成事件和报警,用于监测系统中的异常情况。例如,当温度传感器检测到过高的温度时,设备对象可以生成一个报警,并通知相关的设备或操作人员。

BACnet设备对象是BACnet协议中的核心概念,用于表示建筑自动化系统中的设备,并提供了监测、控制、管理和通信等功能。它在楼宇管理、智能家居、工业控制等领域都有广泛的应用。

BACnet设备对象类型及其相关的函数

static object_functions_t My_Object_Table[] = {
{ OBJECT_DEVICE, NULL /* Init - don't init Device or it will recourse! /,
Device_Count, Device_Index_To_Instance,
Device_Valid_Object_Instance_Number, Device_Object_Name,
Device_Read_Property_Local, Device_Write_Property_Local,
Device_Property_Lists, DeviceGetRRInfo, NULL / Iterator /,
NULL / Value_Lists /, NULL / COV /, NULL / COV Clear /,
NULL / Intrinsic Reporting / },
#if (BACNET_PROTOCOL_REVISION >= 17)
{ OBJECT_NETWORK_PORT, Network_Port_Init, Network_Port_Count,
Network_Port_Index_To_Instance, Network_Port_Valid_Instance,
Network_Port_Object_Name, Network_Port_Read_Property,
Network_Port_Write_Property, Network_Port_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
#endif
{ OBJECT_ANALOG_INPUT, Analog_Input_Init, Analog_Input_Count,
Analog_Input_Index_To_Instance, Analog_Input_Valid_Instance,
Analog_Input_Object_Name, Analog_Input_Read_Property,
Analog_Input_Write_Property, Analog_Input_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /,
Analog_Input_Encode_Value_List, Analog_Input_Change_Of_Value,
Analog_Input_Change_Of_Value_Clear, Analog_Input_Intrinsic_Reporting },
{ OBJECT_ANALOG_OUTPUT, Analog_Output_Init, Analog_Output_Count,
Analog_Output_Index_To_Instance, Analog_Output_Valid_Instance,
Analog_Output_Object_Name, Analog_Output_Read_Property,
Analog_Output_Write_Property, Analog_Output_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_ANALOG_VALUE, Analog_Value_Init, Analog_Value_Count,
Analog_Value_Index_To_Instance, Analog_Value_Valid_Instance,
Analog_Value_Object_Name, Analog_Value_Read_Property,
Analog_Value_Write_Property, Analog_Value_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /,
Analog_Value_Encode_Value_List, Analog_Value_Change_Of_Value,
Analog_Value_Change_Of_Value_Clear, Analog_Value_Intrinsic_Reporting },
{ OBJECT_BINARY_INPUT, Binary_Input_Init, Binary_Input_Count,
Binary_Input_Index_To_Instance, Binary_Input_Valid_Instance,
Binary_Input_Object_Name, Binary_Input_Read_Property,
Binary_Input_Write_Property, Binary_Input_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /,
Binary_Input_Encode_Value_List, Binary_Input_Change_Of_Value,
Binary_Input_Change_Of_Value_Clear, NULL / Intrinsic Reporting / },
{ OBJECT_BINARY_OUTPUT, Binary_Output_Init, Binary_Output_Count,
Binary_Output_Index_To_Instance, Binary_Output_Valid_Instance,
Binary_Output_Object_Name, Binary_Output_Read_Property,
Binary_Output_Write_Property, Binary_Output_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_BINARY_VALUE, Binary_Value_Init, Binary_Value_Count,
Binary_Value_Index_To_Instance, Binary_Value_Valid_Instance,
Binary_Value_Object_Name, Binary_Value_Read_Property,
Binary_Value_Write_Property, Binary_Value_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_CHARACTERSTRING_VALUE, CharacterString_Value_Init,
CharacterString_Value_Count, CharacterString_Value_Index_To_Instance,
CharacterString_Value_Valid_Instance, CharacterString_Value_Object_Name,
CharacterString_Value_Read_Property,
CharacterString_Value_Write_Property,
CharacterString_Value_Property_Lists, NULL / ReadRangeInfo /,
NULL / Iterator /, NULL / Value_Lists /, NULL / COV /,
NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_COMMAND, Command_Init, Command_Count, Command_Index_To_Instance,
Command_Valid_Instance, Command_Object_Name, Command_Read_Property,
Command_Write_Property, Command_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_INTEGER_VALUE, Integer_Value_Init, Integer_Value_Count,
Integer_Value_Index_To_Instance, Integer_Value_Valid_Instance,
Integer_Value_Object_Name, Integer_Value_Read_Property,
Integer_Value_Write_Property, Integer_Value_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
#if defined(INTRINSIC_REPORTING)
{ OBJECT_NOTIFICATION_CLASS, Notification_Class_Init,
Notification_Class_Count, Notification_Class_Index_To_Instance,
Notification_Class_Valid_Instance, Notification_Class_Object_Name,
Notification_Class_Read_Property, Notification_Class_Write_Property,
Notification_Class_Property_Lists, NULL / ReadRangeInfo /,
NULL / Iterator /, NULL / Value_Lists /, NULL / COV /,
NULL / COV Clear /, NULL / Intrinsic Reporting / },
#endif
{ OBJECT_LIFE_SAFETY_POINT, Life_Safety_Point_Init, Life_Safety_Point_Count,
Life_Safety_Point_Index_To_Instance, Life_Safety_Point_Valid_Instance,
Life_Safety_Point_Object_Name, Life_Safety_Point_Read_Property,
Life_Safety_Point_Write_Property, Life_Safety_Point_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_LOAD_CONTROL, Load_Control_Init, Load_Control_Count,
Load_Control_Index_To_Instance, Load_Control_Valid_Instance,
Load_Control_Object_Name, Load_Control_Read_Property,
Load_Control_Write_Property, Load_Control_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_MULTI_STATE_INPUT, Multistate_Input_Init, Multistate_Input_Count,
Multistate_Input_Index_To_Instance, Multistate_Input_Valid_Instance,
Multistate_Input_Object_Name, Multistate_Input_Read_Property,
Multistate_Input_Write_Property, Multistate_Input_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_MULTI_STATE_OUTPUT, Multistate_Output_Init,
Multistate_Output_Count, Multistate_Output_Index_To_Instance,
Multistate_Output_Valid_Instance, Multistate_Output_Object_Name,
Multistate_Output_Read_Property, Multistate_Output_Write_Property,
Multistate_Output_Property_Lists, NULL / ReadRangeInfo /,
NULL / Iterator /, NULL / Value_Lists /, NULL / COV /,
NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_MULTI_STATE_VALUE, Multistate_Value_Init, Multistate_Value_Count,
Multistate_Value_Index_To_Instance, Multistate_Value_Valid_Instance,
Multistate_Value_Object_Name, Multistate_Value_Read_Property,
Multistate_Value_Write_Property, Multistate_Value_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /,
Multistate_Value_Encode_Value_List, Multistate_Value_Change_Of_Value,
Multistate_Value_Change_Of_Value_Clear,
NULL / Intrinsic Reporting / },
{ OBJECT_TRENDLOG, Trend_Log_Init, Trend_Log_Count,
Trend_Log_Index_To_Instance, Trend_Log_Valid_Instance,
Trend_Log_Object_Name, Trend_Log_Read_Property,
Trend_Log_Write_Property, Trend_Log_Property_Lists, TrendLogGetRRInfo,
NULL / Iterator /, NULL / Value_Lists /, NULL / COV /,
NULL / COV Clear /, NULL / Intrinsic Reporting / },
#if (BACNET_PROTOCOL_REVISION >= 14) && defined(BACAPP_LIGHTING_COMMAND)
{ OBJECT_LIGHTING_OUTPUT, Lighting_Output_Init, Lighting_Output_Count,
Lighting_Output_Index_To_Instance, Lighting_Output_Valid_Instance,
Lighting_Output_Object_Name, Lighting_Output_Read_Property,
Lighting_Output_Write_Property, Lighting_Output_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_CHANNEL, Channel_Init, Channel_Count, Channel_Index_To_Instance,
Channel_Valid_Instance, Channel_Object_Name, Channel_Read_Property,
Channel_Write_Property, Channel_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting */ },
#endif#if defined(BACFILE)
{ OBJECT_FILE, bacfile_init, bacfile_count, bacfile_index_to_instance,
bacfile_valid_instance, bacfile_object_name, bacfile_read_property,
bacfile_write_property, BACfile_Property_Lists,
NULL /* ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
#endif
{ OBJECT_OCTETSTRING_VALUE, OctetString_Value_Init, OctetString_Value_Count,
OctetString_Value_Index_To_Instance, OctetString_Value_Valid_Instance,
OctetString_Value_Object_Name, OctetString_Value_Read_Property,
OctetString_Value_Write_Property, OctetString_Value_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_POSITIVE_INTEGER_VALUE, PositiveInteger_Value_Init,
PositiveInteger_Value_Count, PositiveInteger_Value_Index_To_Instance,
PositiveInteger_Value_Valid_Instance, PositiveInteger_Value_Object_Name,
PositiveInteger_Value_Read_Property,
PositiveInteger_Value_Write_Property,
PositiveInteger_Value_Property_Lists, NULL / ReadRangeInfo /,
NULL / Iterator /, NULL / Value_Lists /, NULL / COV /,
NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_SCHEDULE, Schedule_Init, Schedule_Count,
Schedule_Index_To_Instance, Schedule_Valid_Instance,
Schedule_Object_Name, Schedule_Read_Property, Schedule_Write_Property,
Schedule_Property_Lists, NULL / ReadRangeInfo /, NULL / Iterator /,
NULL / Value_Lists /, NULL / COV /, NULL / COV Clear /,
NULL / Intrinsic Reporting / },
{ OBJECT_ACCUMULATOR, Accumulator_Init, Accumulator_Count,
Accumulator_Index_To_Instance, Accumulator_Valid_Instance,
Accumulator_Object_Name, Accumulator_Read_Property,
Accumulator_Write_Property, Accumulator_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ MAX_BACNET_OBJECT_TYPE, NULL / Init /, NULL / Count /,
NULL / Index_To_Instance /, NULL / Valid_Instance /,
NULL / Object_Name /, NULL / Read_Property /,
NULL / Write_Property /, NULL / Property_Lists /,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /,
NULL / Intrinsic Reporting */ }
};

这段代码定义了一个名为My_Object_Table的静态数组,该数组存储了一系列object_functions_t类型的结构体对象。

每个结构体对象表示一个BACnet设备对象类型及其相关的函数和属性列表。每个结构体对象包含以下字段:

type:对象类型,这里是BACnet设备对象类型。
Init:初始化函数指针,用于初始化该BACnet设备对象类型的实例。
Count:计数函数指针,用于获取该BACnet设备对象类型的实例数量。
Index_To_Instance:索引转实例函数指针,用于将索引转换为BACnet设备对象的实例号。
Valid_Instance:验证实例函数指针,用于验证给定的BACnet设备对象实例号是否有效。
Object_Name:对象名称函数指针,用于获取BACnet设备对象的名称。
Read_Property:读取属性函数指针,用于读取BACnet设备对象的属性值。
Write_Property:写入属性函数指针,用于写入BACnet设备对象的属性值。
Property_Lists:属性列表函数指针,用于获取BACnet设备对象支持的属性列表。
ReadRangeInfo:读取范围信息函数指针,用于获取BACnet设备对象属性的范围信息。
Iterator:迭代器函数指针,用于在BACnet设备对象实例之间进行迭代。
Value_Lists:值列表函数指针,用于获取BACnet设备对象属性的值列表。
COV:COV(Change Of Value)函数指针,用于处理BACnet设备对象属性值的变化。
COV_Clear:COV清除函数指针,用于清除BACnet设备对象属性值的变化标志。
Intrinsic_Reporting:内在报告函数指针,用于处理BACnet设备对象的内在报告。

查找BACnet设备对象类型的辅助函数

/*** 辅助函数,用于让Device对象在被处理程序调用时查找需要调用的对象类型。* @ingroup ObjHelpers* @param Object_Type [in] 处理程序希望访问的BACnet对象类型。* @return 指向实现此类型对象的对象辅助函数组的指针。*/
static struct object_functions *Device_Objects_Find_Functions(BACNET_OBJECT_TYPE Object_Type)
{struct object_functions *pObject = NULL;// 将pObject指向对象表的起始位置pObject = Object_Table;// 遍历对象表中的每个对象类型while (pObject->Object_Type < MAX_BACNET_OBJECT_TYPE) {/* 处理每个对象类型 */// 如果找到与传入的Object_Type相匹配的对象类型if (pObject->Object_Type == Object_Type) {// 返回该对象类型的对象辅助函数组return (pObject);}// 指向下一个对象类型pObject++;}// 如果没有找到匹配的对象类型,则返回NULLreturn (NULL);
}
该函数通过遍历Object_Table数组中的对象辅助函数组,将pObject指针逐个与传入的Object_Type进行比较,直到找到匹配的对象类型为止。如果找到了匹配的对象类型,则返回该对象类型的对象辅助函数组的指针;如果没有找到匹配的对象类型,则返回NULL。这个辅助函数在处理BACnet设备对象时非常有用,它允许根据需要动态查找和调用不同类型的对象辅助函数。/*** 辅助函数,尝试查找所请求对象类型的rr_info_function辅助函数。* @ingroup ObjIntf** @param object_type [in] 处理程序希望访问的BACnet对象类型。* @return 指向实现该对象类型的ReadRangeInfo函数(Object_RR_Info)的对象辅助函数指针,*         如果不支持该对象类型或该对象类型没有ReadRangeInfo函数,则返回空指针(NULL)。*/
rr_info_function Device_Objects_RR_Info(BACNET_OBJECT_TYPE object_type)
{struct object_functions *pObject = NULL;// 查找对象类型对应的对象辅助函数组pObject = Device_Objects_Find_Functions(object_type);// 如果找到对应的对象辅助函数组return (pObject != NULL ? pObject->Object_RR_Info : NULL);
}这段代码是一个用于查找BACnet对象类型的ReadRangeInfo函数辅助函数。它尝试查找所请求的对象类型的rr_info_function辅助函数。该函数首先调用Device_Objects_Find_Functions函数,通过传入的object_type参数查找并返回相应BACnet对象类型的对象辅助函数组。然后,它返回对象辅助函数组中的Object_RR_Info函数指针作为ReadRangeInfo函数的实现。如果找到了支持ReadRangeInfo函数的对象类型的对象辅助函数组,则返回该函数指针;如果不支持该对象类型或该对象类型没有ReadRangeInfo函数,则返回空指针(NULL)。这个辅助函数在处理BACnet对象时有用,它允许根据对象类型动态获取和调用相应的ReadRangeInfo函数,以实现对对象属性范围信息的读取操作。

获取特定对象类型的特殊属性列表Device_Objects_Property_List

这段代码是一个用于获取特定对象类型的特殊属性列表的函数。该函数用于处理ReadPropertyMultiple调用,该调用只需要必需属性、可选属性或所有属性。
/**

  • 对于给定的对象类型,返回特殊属性列表。

  • 此函数用于ReadPropertyMultiple调用,它只需要必需属性、可选属性或所有属性。

  • @ingroup ObjIntf

  • @param object_type [in] 所需的BACNET_OBJECT_TYPE,其属性将被列出。

  • @param pPropertyList [out] 引用结构的指针,该结构将在返回时分别列出必需、可选和专有对象属性及其计数。
    */
    void Device_Objects_Property_List(BACNET_OBJECT_TYPE object_type,
    uint32_t object_instance,
    struct special_property_list_t *pPropertyList)
    {
    struct object_functions *pObject = NULL;

    (void)object_instance;

这篇关于BACnet device对象详解以及协议栈相关代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/807463

相关文章

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.

idea的终端(Terminal)cmd的命令换成linux的命令详解

《idea的终端(Terminal)cmd的命令换成linux的命令详解》本文介绍IDEA配置Git的步骤:安装Git、修改终端设置并重启IDEA,强调顺序,作为个人经验分享,希望提供参考并支持脚本之... 目录一编程、设置前二、前置条件三、android设置四、设置后总结一、php设置前二、前置条件

python中列表应用和扩展性实用详解

《python中列表应用和扩展性实用详解》文章介绍了Python列表的核心特性:有序数据集合,用[]定义,元素类型可不同,支持迭代、循环、切片,可执行增删改查、排序、推导式及嵌套操作,是常用的数据处理... 目录1、列表定义2、格式3、列表是可迭代对象4、列表的常见操作总结1、列表定义是处理一组有序项目的

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

SQL Server 中的 WITH (NOLOCK) 示例详解

《SQLServer中的WITH(NOLOCK)示例详解》SQLServer中的WITH(NOLOCK)是一种表提示,等同于READUNCOMMITTED隔离级别,允许查询在不获取共享锁的情... 目录SQL Server 中的 WITH (NOLOCK) 详解一、WITH (NOLOCK) 的本质二、工作