Add message sizes to C++ wrappers.

This adds a max_size field referring to the C #define, indicating the maximum
encoded size of that message type. If the size cannot be determined, for
example due to non-bounded repeated fields, the constant is omitted.

This closes #932
diff --git a/generator/nanopb_generator.py b/generator/nanopb_generator.py
index 8a1dc5f..9f5cb63 100755
--- a/generator/nanopb_generator.py
+++ b/generator/nanopb_generator.py
@@ -1518,10 +1518,14 @@
 
         return result
 
-    def fields_declaration_cpp_lookup(self):
+    def fields_declaration_cpp_lookup(self, local_defines):
         result = 'template <>\n'
         result += 'struct MessageDescriptor<%s> {\n' % (self.name)
         result += '    static PB_INLINE_CONSTEXPR const pb_size_t fields_array_length = %d;\n' % (self.count_all_fields())
+
+        if f"{self.name}_size" in local_defines:
+            result += '    static PB_INLINE_CONSTEXPR const pb_size_t max_size = %s_size;\n' % (self.name)
+
         result += '    static inline const pb_msgdesc_t* fields() {\n'
         result += '        return &%s_msg;\n' % (self.name)
         result += '    }\n'
@@ -2167,7 +2171,7 @@
             yield '/* Message descriptors for nanopb */\n'
             yield 'namespace nanopb {\n'
             for msg in self.messages:
-                yield msg.fields_declaration_cpp_lookup() + '\n'
+                yield msg.fields_declaration_cpp_lookup(local_defines) + '\n'
             yield '}  // namespace nanopb\n'
             yield '\n'
             yield '#endif  /* __cplusplus */\n'
diff --git a/tests/cxx_descriptor/message_descriptor.cc b/tests/cxx_descriptor/message_descriptor.cc
index 04c63b3..cbaae7e 100644
--- a/tests/cxx_descriptor/message_descriptor.cc
+++ b/tests/cxx_descriptor/message_descriptor.cc
@@ -19,6 +19,9 @@
   TEST(MessageDescriptor<MyNonEmptyMessage>::fields_array_length ==
        MyNonEmptyMessage_msg.field_count);
 
+  TEST(MessageDescriptor<MyNonEmptyMessage>::max_size ==
+       MyNonEmptyMessage_size);
+
   TEST(MessageDescriptor<MyEmptyMessage>::fields() == MyEmptyMessage_fields);
   TEST(MessageDescriptor<MyNonEmptyMessage>::fields() ==
        MyNonEmptyMessage_fields);