Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does `int ;` compile fine in C, but not in C++?

Consider the following program (see live demo here).

#include <stdio.h> int main(void) {       int ;  // Missing variable name       puts("Surprise"); } 

My compiler, gcc 4.8.1, gives the below warning:

[Warning] useless type name in empty declaration [enabled by default]

Why does it compile fine? Shouldn't I get a compiler error? g++ 4.8.1 gives the following error when I compile it as a C++ program:

[Error] declaration does not declare anything [-fpermissive]

like image 809
Destructor Avatar asked Oct 22 '15 04:10

Destructor


Video Answer


2 Answers

The C standard says

A declaration other than a static_assert declaration shall declare at least a declarator (other than the parameters of a function or the members of a structure or union), a tag, or the members of an enumeration.

C++ says

In a simple-declaration, the optional init-declarator-list can be omitted only when declaring a class (Clause 9) or enumeration.

A violation of this in either language requires a diagnostic. The standards do not talk about compiler errors or warnings. A warning is a diagnostic.

like image 148
n. 1.8e9-where's-my-share m. Avatar answered Oct 12 '22 09:10

n. 1.8e9-where's-my-share m.


Your code is illegal (i.e. erroneous, ill-formed, constraint-violating) in both C and C++. The reason you get a "warning" in one language and "error" in another is just a quirk of your compiler and your compiler setup. After all, neither language really formally differentiates between "warnings" and "errors". GCC under its default settings just happens to be more permissive in C mode (mostly for historical reasons).

Use -pedantic-errors in GCC, and you will get an "error" in C code as well. (Note that -pedantic-errors does not simply blindly turn all "warnings" into "errors". It attempts to report only actual constraint violations as "errors".)

like image 36
AnT Avatar answered Oct 12 '22 08:10

AnT