5 ms·
This might be my biggest gripe with C's syntax. typename identifier[]; means three different things, depending on where it appears: As a function argument, it
by brandmeyer 11y ago
This might be my biggest gripe with C's syntax.
typename identifier[];
means three different things, depending on where it appears: As a function argument, it is a pointer that will be accessed like an array. As a variable with automatic storage duration, it is an array whose size will be determined by the right-hand-side of an assignment from a braced initializer list. In the middle of a struct definition, it's illegal. And at the end of a struct definition, it is a flexible array member.
- seba_dos1 11y agoMy favorite is similar thing, but in C++ and much more confusing: class Bar {}; class Foo { public: Foo(const Bar &c) { } void method() { } }; int main() { Foo foo(Bar()); foo.method(); return 0; } "foo.method();" doesn't compile because: error: request for member ‘method’ in ‘foo’, which is of non-class type ‘Foo(Bar (*)())’ That's right: "foo" is a declared function that returns instance of Foo and takes one argument - a function that returns instance of Bar :) But when you add additional parentheses in a line above: Foo foo((Bar())); then "foo" is an instance of Foo created by passing a new instance of Bar to its constructor, which is more like what you'd expect by reading the code, and the code compiles. Fun!
- BudVVeezer 11y agoYes, the most vexing parse. https://en.wikipedia.org/wiki/Most_vexing_parse https://en.wikipedia.org/wiki/Most_vexing_parse
- tylorr 11y agoI believe this situation is usually referred to as the "Most vexing parse".
- bobbyi_settv 11y agoC++11 initialization syntax solves this https://en.wikipedia.org/wiki/Most_vexing_parse#Uniform_initialization_syntax https://en.wikipedia.org/wiki/Most_vexing_parse#Uniform_init...
- Peaker 11y agoAs an extern'd variable it's an array of unknown length