96 votes

S'agit-il d'un programme C ou d'un programme C++ ?

#include <iostream>

using namespace std;
int main() {
  printf("hello");
  getchar();
  return 0;
}

Ici, j'ai utilisé <iostream> . Les printf fonctionne ; cout fonctionne également. S'agit-il donc d'un programme C ou C++ ?

264voto

Flexo Points 39273

Non plus, il s'agit d'une erreur.

Sur mon compilateur C++ conforme, c'est une erreur parce que vous n'avez pas #include <stdio.h> et le C++ n'autorise pas les déclarations implicites de printf y getchar .

En C, c'est une erreur à cause de using namespace std; .

91voto

Mysticial Points 180300

Il s'agit d'un programme C++. Le C n'a pas d'espaces de noms.

73voto

Gregory Pakosz Points 35546

C'est un programme C++, vous ne pouvez pas le compiler sans un compilateur C++ (ou sans tromper un compilateur C pour qu'il le compile, voir le commentaire de @Dan ci-dessous).

iostream est un en-tête C++, namespace sont une caractéristique du C++.

EDIT : ok, j'ai essayé de le compiler

Mac, Snow Leopard, i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3)

  • gcc main.cpp -> KO

    Undefined symbols: "std::ios_base::Init::Init()", referenced from: __static_initialization_and_destruction_0(int, int)in cc85GAQs.o "std::basic_string, std::allocator >::size() const", referenced from: std::__verify_grouping(char const*, unsigned long, std::basic_string, std::allocator > const&)in cc85GAQs.o "std::basic_string, std::allocator >::operator[](unsigned long) const", referenced from: std::__verify_grouping(char const*, unsigned long, std::basic_string, std::allocator > const&)in cc85GAQs.o std::__verify_grouping(char const*, unsigned long, std::basic_string, std::allocator > const&)in cc85GAQs.o std::__verify_grouping(char const*, unsigned long, std::basic_string, std::allocator > const&)in cc85GAQs.o "___gxx_personality_v0", referenced from: std::__verify_grouping(char const*, unsigned long, std::basic_string, std::allocator > const&)in cc85GAQs.o ___tcf_0 in cc85GAQs.o _main in cc85GAQs.o unsigned long const& std::min(unsigned long const&, unsigned long const&)in cc85GAQs.o __static_initialization_and_destruction_0(int, int)in cc85GAQs.o global constructors keyed to mainin cc85GAQs.o CIE in cc85GAQs.o "std::ios_base::Init::~Init()", referenced from: ___tcf_0 in cc85GAQs.o ld: symbol(s) not found

  • g++ main.cpp -> OK

  • cc main.c , gcc main.c -> KO

    main.c:1:20: error: iostream: No such file or directory main.c:3: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘namespace’ main.c: In function ‘main’: main.c:5: warning: incompatible implicit declaration of built-in function ‘printf’

  • g++ main.c -> OK

Linux, LMDE, gcc (Debian 4.6.1-4) 4.6.1

  • gcc main.cpp -> KO

    main.cpp:5:15: error: ‘printf’ was not declared in this scope main.cpp:6:9: error: ‘getchar’ was not declared in this scope

  • g++ main.cpp -> KO

    main.cpp:5:15: error: ‘printf’ was not declared in this scope main.cpp:6:9: error: ‘getchar’ was not declared in this scope

Windows 7, MSVC 2005

  • Compilation en C++ -> OK

Je considère donc qu'il s'agit d'un mauvais programme C++ ; et le compiler avec succès dépend de l'implémentation du compilateur.

50voto

Dan Moulding Points 46866

C'est impossible à dire. Cela dépend entièrement du contenu des <iostream> . Si <iostream> est en effet la norme C++ <iostream> il s'agit alors d'un programme C++. Cependant, si l'en-tête <iostream> est un en-tête C que quelqu'un a piraté, et dans lequel sont définies des macros pour using y namespace alors il pourrait très bien s'agir d'un programme C.

18voto

Unsigned Points 3312

Dans un environnement normal (standard), il s'agit de C++.

  • #include <iostream> sans le .h sur le nom du fichier d'en-tête est une caractéristique du C++.
  • iostream qui est un en-tête standard du C++, n'existe pas dans le C standard.
  • using y namespace sont des mots réservés uniquement en C++.
  • std est l'espace de noms standard en C++. Le langage C ne prend pas du tout en charge les espaces de noms.

Toutefois, dans un environnement personnalisé (insane), les cas suivants pourraient se présenter :

  • Chemin de recherche d'inclusion du compilateur personnalisé pour <>
  • Fichier d'en-tête personnalisé nommé iostream
  • using , namespace y std pourraient être des macros de préprocesseur définies dans iostream .

En théorie, il pourrait sont valides C.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X