This blog post shows (with a counterexample) that C++ is not a superset of C, i.e. there is a valid C program which is not a valid C++ program.
It's easy to find a counterexample: just use a C++ keyword as a variable name in C. The program is int class;
. The proof:
$ gcc -v gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9) $ g++ -v gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9) $ echo 'int class;' | tee t.c t.cc >/dev/null $ gcc -c -pedantic -ansi -W -Wall t.c $ g++ -c t.cc t.cc:1: error: expected identifier before ‘;’ token t.cc:1: error: multiple types in one declaration t.cc:1: error: declaration does not declare anything
There is a counterexample which doesn't contain any C++ keywords. The program is int i=&i;
. The code:
$ echo 'int i=&i;' | tee t.c t.cc >/dev/null $ gcc -c -pedantic -ansi -W -Wall t.c t.c:1: warning: initialization makes integer from pointer without a cast $ g++ -c t.cc t.cc:1: error: invalid conversion from ‘int*’ to ‘int’
There is a counterexample which doesn't contain any C++ keywords, and it compiles without a warning as C code. The program is char *p=(void*)0;
$ echo 'char *p=(void*)0;' | tee t.c t.cc >/dev/null $ gcc -c -pedantic -ansi -W -Wall t.c $ gcc -c -pedantic -std=c89 -W -Wall t.c $ gcc -c -pedantic -std=c99 -W -Wall t.c $ gcc -c -pedantic -std=c9x -W -Wall t.c $ gcc -c -pedantic -std=gnu89 -W -Wall t.c $ gcc -c -pedantic -std=gnu99 -W -Wall t.c $ gcc -c -pedantic -std=gnu9x -W -Wall t.c $ tcc -W -Wall -c t.c $ 8c -c -w t.c $ g++ -c t.cc t.cc:1: error: invalid conversion from ‘void*’ to ‘char*’
As a bonus: there is a program source which compiles in both C and C++, but it does something different. The following example is based on the fact that sizeof('x')
is 1 in C++, but it's at least 2 in C.
#include <stdio.h> int main(){return!printf("Hello, C%s!\n", "++"+1%sizeof('x')*2);}
Another idea to make the same program source do something else in C than C++ is to take advantage of that union t
(etc.) create a type named t
in C++, but not in C.
#include <stdio.h> char t; int main(){union t{int u;}; return!printf("Hello, C%s!\n", "++"+(sizeof(t)<2)*2);}
So the true statement is: C and C++ are similar languages, with a large common subset, and C++ being much larger to the common subset than C is.
While this is not a very neat example (it generates warnings with newer GCCs), it is also correct code and serves the same purpose:
ReplyDelete#include
int main(void) { int a = 6 //* divide in C */3;
+2; if (a == 2) printf("C\n"); else printf("C++\n"); return 0; }
Sorry for the badly formatted code, but I don't know how to keep neat indentation here.