Code Generation for Enumerations
Enumerations represent a fixed set of named values. Enumerations help make your MATLAB® code
and generated C/C++ code more readable. For example, the generated
code can test equality with code such as if (x == Red)
instead
of using strcmp
.
For code generation, when you use enumerations, adhere to these restrictions:
Calls to methods of enumeration classes are not supported.
Passing strings or character vectors to constructors of enumerations is not supported.
The enumeration class must derive from one of these base types:
int8
,uint8
,int16
,uint16
,int32
, oruint32
. See Define Enumerations for Code Generation.You can use only a limited set of operations on enumerations. See Allowed Operations on Enumerations.
Use enumerations with functions that support enumerated types for code generation. See MATLAB Toolbox Functions That Support Enumerations.
Define Enumerations for Code Generation
For code generation, the enumeration class must derive from one of these base types:
int8
, uint8
, int16
,
uint16
, int32
, or uint32
.
For
example:
classdef PrimaryColors < int32 enumeration Red(1), Blue(2), Yellow(4) end end
You can use the base type to control the size of an enumerated type in generated C/C++ code. You can:
Represent an enumerated type as a fixed-size integer that is portable to different targets.
Reduce memory usage.
Interface with legacy code.
Match company standards.
Representation of Enumerated Type in Generated Code
C++11 and newer standards support enumeration classes. If you generate C++ code and set the target language standard to C++11 or newer, the code generator converts MATLAB enumerations to enumeration classes in the generated C++ code. Otherwise, the code generator converts MATLAB enumerations to ordinary C enumerations in the generated C/C++ code. Therefore, the representation of the enumerated type in the generated C/C++ code depends on:
The base type of the MATLAB enumeration
The target language
The target language standard (if the target language is C++)
To change the target language standard, see Change Language Standard Used for Code Generation.
Base Type is Native Integer Type. If the base type is the native integer type for the target platform (for
example, int32
), the code generator produces a C/C++
enumerated type. Consider this MATLAB enumerated type definition:
classdef LEDcolor < int32 enumeration GREEN(1), RED(2) end end
If you generate C code or C++03 code, the generated enumeration is:
enum LEDcolor
{
GREEN = 1,
RED
};
If you generate C++11 or newer code, the generated code contains an enumeration class (by default) that explicitly defines the underlying type:
enum class LEDcolor : int
{
GREEN = 1,
RED
};
Base Type is Different from the Native Integer Type. Suppose that built-in integer base type for the enumeration is different from the native integer type for the target platform. For example, consider this MATLAB enumerated type definition:
classdef LEDcolor < int16 enumeration GREEN(1), RED(2) end end
If you generate C code, the code generator produces a
typedef
statement for the enumerated type and#define
statements for the enumerated values. For example, the enumerated type definitionLEDcolor
produces this C code:typedef short LEDcolor; #define GREEN ((LEDcolor)1) #define RED ((LEDcolor)2)
If you generate C++03 code, the enumeration members are converted to constants. These constants belong to the namespace that contains the enumeration type definition in the generated C++ code.
For example, suppose that you place the enumerated type definition
LEDcolor
inside the MATLAB namespacenmsp
and generate C++03 code. The default behavior of the code generator is to convert MATLAB namespaces to C++ namespaces. The generated C++ code is placed inside the namespacenmsp
:namespace nmsp { typedef short LEDcolor; // enum nmsp_LEDcolor const LEDcolor GREEN{1}; const LEDcolor RED{2}; }
C++11 and newer language standards allow you to specify the underlying type of an enumeration, just like MATLAB does. If you generate code using C++11 or a newer language standard, the MATLAB enumeration class is converted to an enumeration class (by default) that explicitly defines the underlying type.
For example, suppose that you place the enumerated type definition
LEDcolor
inside the MATLAB namespacenmsp
. if you generate C++11 code, the default behavior of the code generator is to convert MATLAB namespaces to C++ namespaces. The generated C++11 code is placed inside the namespacenmsp
:namespace nmsp { enum class LEDcolor : short { GREEN = 1, // Default value RED }; }
The C/C++ type in the typedef
statement (for C and C++03
code) or the underlying type of the enumeration class (for C++11 and newer
code) depends on:
The integer sizes defined for the production hardware in the hardware implementation object or the project settings. See
coder.HardwareImplementation
.The setting that determines the use of built-in C types or MathWorks® typedefs in the generated code. See Specify Data Types Used in Generated Code and Mapping MATLAB Types to Types in Generated Code.
Generate C++ Code That Contains Ordinary C Enumerations. You can instruct the code generator to produce ordinary C enumerations, even if you generate code with a language standard that supports enumeration classes, such as C++11 or newer. To change the default, use one of these approaches:
In the code generation configuration object, set the
CppGenerateEnumClass
property tofalse
.In the MATLAB Coder™ app, in the Generate step, on the Code Appearance tab, clear the Generate C++ enum class from MATLAB enumeration check box.
To instruct the code generator to produce ordinary C enumeration for a
particular MATLAB enumeration class in your code, include the static method
generateEnumClass
that returns false
in the implementation of that MATLAB enumeration class. See Customize Enumerated Types in Generated Code.
Allowed Operations on Enumerations
For code generation, you are restricted to the operations on enumerations listed in this table.
Operation | Example | Notes |
---|---|---|
assignment operator: |
xon = LEDcolor.GREEN xoff = LEDcolor.RED |
— |
relational operators: |
xon == xoff |
Code generation does not support using |
cast operation |
double(LEDcolor.RED) |
— |
conversion to character array or string |
y = char(LEDcolor.RED); y1 = cast(LEDcolor.RED,'char'); y2 = string(LEDcolor.RED); |
|
indexing operation |
m = [1 2] n = LEDcolor(m) p = n(LEDcolor.GREEN) |
— |
control flow statements: if, switch, while |
if state == sysMode.ON led = LEDcolor.GREEN; else led = LEDcolor.RED; end |
— |
MATLAB Toolbox Functions That Support Enumerations
For code generation, you can use enumerations with these MATLAB toolbox functions: