> it should be `int main() { List(Foo) foo_list = {NULL};`
In C `int main()` means the function takes an unknown number of arguments. You need `int main(void)` to mean it doesn't take any arguments. This is a fact frequently forgotten by those who write C++.
This is incorrect. In a function definition, an empty list means it takes no parameters. 6.7.5.3 Function declarators
> 14. An empty list in a function declarator that is part of a definition of that function specifies that the function has no parameters.
That had been harmonized with C++ in C23 (e.g. func() is equivalent with func(void) now).
It's not really relevant for main() though, even in older C versions main() works fine and simply means "I don't need argc and argv".