is `end` a keyword for c code?
if I simply add a field named 'end' to any struct or table, the generated code compilation will fail.
for example:
table Monster {
pos:Vec3; // Struct.
mana:short = 150;
hp:short = 100;
name:string;
friendly:bool = false (deprecated);
inventory:[ubyte]; // Vector of scalars.
color:Color = Blue; // Enum.
weapons:[Weapon]; // Vector of tables.
equipped:Equipment; // Union.
end:short;
}
added end:short; at the end of Monster.
then update the creation code and compile, got the following error:
/Users/github/mymonster/generated/monster_builder.h:54:1: error: conflicting types for 'MyGame_Sample_Monster_end'
__flatbuffers_build_table(flatbuffers_, MyGame_Sample_Monster, 11)
^
/Users/github/mymonster/generated/flatbuffers_common_builder.h:394:27: note: expanded from macro '__flatbuffers_build_table'
static inline N ## _ref_t N ## _end(NS ## builder_t *B)\
^
<scratch space>:69:1: note: expanded from here
MyGame_Sample_Monster_end
^
/Users/github/mymonster/generated/monster_reader.h:162:1: note: previous definition is here
__flatbuffers_define_scalar_field(10, MyGame_Sample_Monster, end, flatbuffers_int16, int16_t, INT16_C(0))
^
/Users/github/mymonster/generated/flatbuffers_common_reader.h:39:17: note: expanded from macro '__flatbuffers_define_scalar_field'
static inline T N ## _ ## NK(N ## _table_t t__tmp)\
^
<scratch space>:22:1: note: expanded from here
MyGame_Sample_Monster_end
^
In file included from /Users/github/mymonster/src/monster.c:12:
/Users/github/mymonster/generated/monster_builder.h:68:1: warning: incompatible pointer types passing 'flatbuffers_builder_t *' (aka 'struct flatcc_builder *') to parameter of type 'MyGame_Sample_Monster_table_t' (aka 'const struct MyGame_Sample_Monster_table *') [-Wincompatible-pointer-types]
__flatbuffers_build_table_prolog(flatbuffers_, MyGame_Sample_Monster, MyGame_Sample_Monster_file_identifier, MyGame_Sample_Monster_type_identifier)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/github/mymonster/generated/flatbuffers_common_builder.h:70:59: note: expanded from macro '__flatbuffers_build_table_prolog'
#define __flatbuffers_build_table_prolog(NS, N, FID, TFID)\
^
/Users/github/mymonster/generated/flatbuffers_common_builder.h:262:35: note: expanded from macro '\
__flatbuffers_build_table_vector_ops'
{ return N ## _push(B, TN ## _end(B)); }\
^
/Users/github/mymonster/generated/monster_reader.h:162:1: note: passing argument to parameter 't__tmp' here
__flatbuffers_define_scalar_field(10, MyGame_Sample_Monster, end, flatbuffers_int16, int16_t, INT16_C(0))
^
/Users/github/mymonster/generated/flatbuffers_common_reader.h:39:44: note: expanded from macro '__flatbuffers_define_scalar_field'
static inline T N ## _ ## NK(N ## _table_t t__tmp)\
^
In file included from /Users/github/mymonster/src/monster.c:12:
/Users/github/mymonster/generated/monster_builder.h:68:1: warning: incompatible pointer types passing 'flatbuffers_builder_t *' (aka 'struct flatcc_builder *') to parameter of type 'MyGame_Sample_Monster_table_t' (aka 'const struct MyGame_Sample_Monster_table *') [-Wincompatible-pointer-types]
__flatbuffers_build_table_prolog(flatbuffers_, MyGame_Sample_Monster, MyGame_Sample_Monster_file_identifier, MyGame_Sample_Monster_type_identifier)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/github/mymonster/generated/flatbuffers_common_builder.h:71:55: note: expanded from macro '__flatbuffers_build_table_prolog'
__flatbuffers_build_table_vector_ops(NS, N ## _vec, N)\
^
/Users/github/mymonster/generated/flatbuffers_common_builder.h:50:40: note: expanded from macro '\
__flatbuffers_build_table_root'
{ return NS ## buffer_end(B, N ## _end(B)); }\
^
/Users/github/mymonster/generated/monster_reader.h:162:1: note: passing argument to parameter 't__tmp' here
__flatbuffers_define_scalar_field(10, MyGame_Sample_Monster, end, flatbuffers_int16, int16_t, INT16_C(0))
^
/Users/github/mymonster/generated/flatbuffers_common_reader.h:39:44: note: expanded from macro '__flatbuffers_define_scalar_field'
static inline T N ## _ ## NK(N ## _table_t t__tmp)\
^
In file included from /Users/github/mymonster/src/monster.c:12:
/Users/github/mymonster/generated/monster_builder.h:68:1: warning: incompatible pointer types passing 'flatbuffers_builder_t *' (aka 'struct flatcc_builder *') to parameter of type 'MyGame_Sample_Monster_table_t' (aka 'const struct MyGame_Sample_Monster_table *') [-Wincompatible-pointer-types]
__flatbuffers_build_table_prolog(flatbuffers_, MyGame_Sample_Monster, MyGame_Sample_Monster_file_identifier, MyGame_Sample_Monster_type_identifier)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/github/mymonster/generated/flatbuffers_common_builder.h:71:55: note: expanded from macro '__flatbuffers_build_table_prolog'
__flatbuffers_build_table_vector_ops(NS, N ## _vec, N)\
^
/Users/github/mymonster/generated/flatbuffers_common_builder.h:52:40: note: expanded from macro '\
__flatbuffers_build_table_root'
{ return NS ## buffer_end(B, N ## _end(B)); }\
^
/Users/github/mymonster/generated/monster_reader.h:162:1: note: passing argument to parameter 't__tmp' here
__flatbuffers_define_scalar_field(10, MyGame_Sample_Monster, end, flatbuffers_int16, int16_t, INT16_C(0))
^
/Users/github/mymonster/generated/flatbuffers_common_reader.h:39:44: note: expanded from macro '__flatbuffers_define_scalar_field'
static inline T N ## _ ## NK(N ## _table_t t__tmp)\
^
In file included from /Users/github/mymonster/src/monster.c:12:
/Users/github/mymonster/generated/monster_builder.h:117:38: warning: incompatible pointer types passing 'flatbuffers_builder_t *' (aka 'struct flatcc_builder *') to parameter of type 'MyGame_Sample_Monster_table_t' (aka 'const struct MyGame_Sample_Monster_table *') [-Wincompatible-pointer-types]
return MyGame_Sample_Monster_end(B);
^
/Users/github/mymonster/generated/monster_reader.h:162:1: note: passing argument to parameter 't__tmp' here
__flatbuffers_define_scalar_field(10, MyGame_Sample_Monster, end, flatbuffers_int16, int16_t, INT16_C(0))
^
/Users/github/mymonster/generated/flatbuffers_common_reader.h:39:44: note: expanded from macro '__flatbuffers_define_scalar_field'
static inline T N ## _ ## NK(N ## _table_t t__tmp)\
^
In file included from /Users/github/mymonster/src/monster.c:12:
/Users/github/mymonster/generated/monster_builder.h:135:63: warning: incompatible pointer types passing 'flatbuffers_builder_t *' (aka 'struct flatcc_builder *') to parameter of type 'MyGame_Sample_Monster_table_t' (aka 'const struct MyGame_Sample_Monster_table *') [-Wincompatible-pointer-types]
__flatbuffers_memoize_end(B, t, MyGame_Sample_Monster_end(B));
^
/Users/github/mymonster/generated/flatbuffers_common_builder.h:24:101: note: expanded from macro '__flatbuffers_memoize_end'
#define __flatbuffers_memoize_end(B, src, op) do { return flatcc_builder_refmap_insert((B), (src), (op)); } while (0)
^~
/Users/github/mymonster/generated/monster_reader.h:162:1: note: passing argument to parameter 't__tmp' here
__flatbuffers_define_scalar_field(10, MyGame_Sample_Monster, end, flatbuffers_int16, int16_t, INT16_C(0))
^
/Users/github/mymonster/generated/flatbuffers_common_reader.h:39:44: note: expanded from macro '__flatbuffers_define_scalar_field'
static inline T N ## _ ## NK(N ## _table_t t__tmp)\
^
5 warnings and 1 error generated.
It probably is, I don't recall all names, but historically and for convenience, field names could be referenced just by their field name, ca. like mytable_myfield. But that can conflict with other generated names.
The solution is to use mytable_get_myfield which is also supported.
That doesn't by itself remove the conflict but using the flatcc -g option (for get only) will omit the simple version of accessor names so you have to use the get version.
This removes potential name conflicts.
To be clear, end is not a C keyword, but it is very likely used in names generated by flatcc such as mytable_begin(builder), mytable_end(builder).
Correction: it is mytable_myfield_get so what you want is
Monster_end_get
And remove Monster_end using the -g option.
I added a commit to issue warnings on some conflicting names. It would create a warning in your example, and your example can be fixed with the -g option, although it is better to use a different name if possible: