These include macros for specifying that a function should be run as a test, macros for controlling the visibility of items, and macros for generating code at compile time. Three types of procedural macros are covered: custom derive macros, function-like macros, and attribute macros. Custom derive macros add functionality to structs, enums, and unions, while function-like macros are invoked using the macro invocation operation !