Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

int a[] = {1,2,}; Why is a trailing comma in an initializer-list allowed?

Maybe I am not from this planet, but it would seem to me that the following should be a syntax error:

int a[] = {1,2,}; //extra comma in the end 

But it's not. I was surprised when this code compiled on Visual Studio, but I have learnt not to trust MSVC compiler as far as C++ rules are concerned, so I checked the standard and it is allowed by the standard as well. You can see 8.5.1 for the grammar rules if you don't believe me.

enter image description here

Why is this allowed? This may be a stupid useless question but I want you to understand why I am asking. If it were a sub-case of a general grammar rule, I would understand - they decided not to make the general grammar any more difficult just to disallow a redundant comma at the end of an initializer list. But no, the additional comma is explicitly allowed. For example, it isn't allowed to have a redundant comma in the end of a function-call argument list (when the function takes ...), which is normal.

So, again, is there any particular reason this redundant comma is explicitly allowed?

like image 243
Armen Tsirunyan Avatar asked Aug 12 '11 16:08

Armen Tsirunyan


People also ask

Does C++ allow trailing commas?

Trailing comma in enum was introduced in C99 as a feature. It does not exist in C90 nor C++ versions that were based on a pre-C99 baseline.

Are trailing commas allowed in JavaScript?

JavaScript has allowed trailing commas in array literals since the beginning, and later added them to object literals, and more recently, to function parameters and to named imports and named exports. JSON, however, disallows trailing commas.

What is a trailing comma in Python?

Description: In Python, a tuple is actually created by the comma symbol, not by the parentheses. Unfortunately, one can actually create a tuple by misplacing a trailing comma, which can lead to potential weird bugs in your code. You should always use parentheses explicitly for creating a tuple.


2 Answers

It makes it easier to generate source code, and also to write code which can be easily extended at a later date. Consider what's required to add an extra entry to:

int a[] = {    1,    2,    3 }; 

... you have to add the comma to the existing line and add a new line. Compare that with the case where the three already has a comma after it, where you just have to add a line. Likewise if you want to remove a line you can do so without worrying about whether it's the last line or not, and you can reorder lines without fiddling about with commas. Basically it means there's a uniformity in how you treat the lines.

Now think about generating code. Something like (pseudo-code):

output("int a[] = {"); for (int i = 0; i < items.length; i++) {     output("%s, ", items[i]); } output("};"); 

No need to worry about whether the current item you're writing out is the first or the last. Much simpler.

like image 55
Jon Skeet Avatar answered Oct 17 '22 23:10

Jon Skeet


It's useful if you do something like this:

int a[] = {   1,   2,   3, //You can delete this line and it's still valid }; 
like image 39
Skilldrick Avatar answered Oct 17 '22 22:10

Skilldrick