Transferred from
Http://hi.baidu.com/guoyanjoy2/blog/item/cfd14bcb978478f952664f14.html
Differences between GCC and G ++
When we compile C/C ++ Code, some people use GCC and some people use g ++, so all kinds of statements come, such as C code using gcc, c ++ Code uses g ++, or GCC for compilation, and the link uses g ++. At the moment, I do not know which statement is correct. If the previous extern "C ", there are more differences. Here I want to end it. After all, the purpose of knowledge is to be clearer, not more confused.
Misunderstanding 1: GCC can only compile C code, while G ++ can only compile C ++ codeBoth can be used, but note: 1. suffix. c, GCC treats it as a C program, while G ++ treats it as a C ++ program; suffix. CPP, both of which are considered as C ++ programs. Note that although C ++ is a superset of C, their syntax requirements are different. For example: # include <stdio. h> int main (INT argc, char * argv []) {
If (argv = 0) return; printstring (argv); return;
}
Int printstring (char * string ){
Sprintf (string, "this is a test./N ");
} If it is OK according to the C syntax rules, but once the suffix is changed to CPP, three errors are immediately reported: "printstring undefined "; "cannot convert 'Char ** 'to 'Char *"; "Return-statement with no value"; corresponds to the section marked in red. It can be seen that the syntax rules of C ++ are more rigorous. 2. in the compilation phase, G ++ calls GCC. For C ++ code, the two are equivalent, but because the GCC command cannot be automatically connected to the library used by the C ++ program, therefore, we usually use g ++ to complete the link. For the sake of unification, we simply use g ++ to compile/link all. This gives us the illusion that, it seems that CPP programs can only use g ++.
Misunderstanding 2: GCC does not define the _ cplusplus macro, while G ++ willIn fact, this macro only indicates that the compiler will interpret the code in the C or C ++ syntax. As mentioned above, if the suffix is. c. If the GCC compiler is used, the macro is undefined. Otherwise, the macro is defined.
Misunderstanding 3: only GCC can be used for compilation, and only G ++ can be used for Link
Strictly speaking, this sentence is not a mistake, but it obfuscated the concept. It should be said that gcc/g ++ can be used for compilation, the link can use g ++ or GCC-lstdc ++. Because the GCC command cannot be automatically connected to the library used by the C ++ program, G ++ is usually used to complete the connection. However, in the compilation phase, G ++ automatically calls GCC, which is equivalent to the two.
Misunderstanding 4: extern "C" is related to GCC/g ++In fact, it does not matter. Whether it is GCC or G ++, when using extern "C", it is named as C. Otherwise, all are named in C ++ mode. The test is as follows:
Me. h:
Extern "C" Void cppprintf (void );
Me. cpp:
# Include <iostream>
# Include "me. H"
Using namespace STD;
Void cppprintf (void)
{
Cout <"Hello/N ";
}
Test. cpp:
# Include <stdlib. h>
# Include <stdio. h>
# Include "me. H"
Int main (void)
{
Cppprintf ();
Return 0;
}
1. Add extern "c" to me. h to see if the names of GCC and G ++ are different.[Root @ root g ++] # G ++-s me. cpp
[Root @ root g ++] # less me. s
. Globl _ z9cppprintfv // note the name of this function
. Type cppprintf, @ function [root @ root GCC] # gcc-s me. cpp
[Root @ root GCC] # less me. s
. Globl _ z9cppprintfv // note the name of this function
. Type cppprintf, @ Function
Identical!
2. Remove extern "C" from me. h to see if the GCC and G ++ naming are different.
[Root @ root GCC] # gcc-s me. cpp
[Root @ root GCC] # less me. s
. Globl _ z9cppprintfv // note the name of this function
. Type _ z9cppprintfv, @ function [root @ root g ++] # G ++-s me. cpp
[Root @ root g ++] # less me. s
. Globl _ z9cppprintfv // note the name of this function
. Type _ z9cppprintfv, @ Function
Identical!
[Conclusion]Completely the same, it can be seen that extern "C" is irrelevant to the use of GCC/g ++. The above test also indirectly confirms the previous statement: In the compilation stage, g ++ calls GCC.