Visual Studio 2012: automatisches einbinden von Headerdateien?

08/09/2012 20:29 -Epitaph-#1
Mir ist aufgefallen, dass ich, ohne bestimmte Headerdateien einzubinden, manchmal trotzdem Objekte und Funktionen nutzen kann wie z.B. cout aus iostream oder exit() bzw. abort() aus cstdlib/stdlib.h.

Kann's vielleicht sein, dass VS 2012 die automatisch lädt?
habe ein normales WIN32 Konsolenprojekt ohne Headerdateien und sonstiges erstellt. Und was hat es mit dem Ordner "Externe Abhängigkeiten" auf sich? dort sammeln sich verschiedene Dateien und darunter auch cstdlib und iostream.
08/10/2012 00:44 MrSm!th#2
Joa, dann wird VS12 das wohl so tun.
Externe Abhängigkeiten kenne ich aus virtuellen Sprachen wie C# oder Java, wo im Projekt auch immer ein Ordner für externe Abhängigkeiten ist, die, was den Standard angeht, automatisch eingebunden werden, wenn sie im Projekt verwendet werden.
VS12 macht das gleiche dann wohl nun auch für C++.
08/10/2012 01:00 Kosic#3
Finde ich persönlich nicht gut dass VS2012 das macht.
08/10/2012 08:07 Nightblizard#4
Kann ich nicht bestätigen. Visual Studio 2012 Release Candidate erstellt mir folgende Dateien bei einem Win32 Projekt:

stdafx.h
Code:
#pragma once

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>
targetver.h
Code:
#pragma once
#include <SDKDDKVer.h>
<ProjektName>.h
Code:
#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
	return 0;
}
stdafx.cpp
Code:
#include "stdafx.h"
Ich lediglich Zugriff auf std::nullptr_t.

Und "Externe Abhängigkeiten" werden nicht automatisch eingebunden, ganz im Gegenteil. Das ist einfach eine Liste aller eingebundenen Header, die nicht direkt zu deinem Projekt gehören.
08/10/2012 12:58 -Epitaph-#5
Quote:
Originally Posted by Kosic View Post
Finde ich persönlich nicht gut dass VS2012 das macht.
Find ich auch nicht gut. Besonders wenn man C++ lernt >.>
Man will ja auch lernen wo sich was befindet und so :(

Hab nochmal einen Test mit einem ganz neuem LEEREM WIN32 Konsolenprojekt gemacht in der ich nur eine .cpp mit dem Code:
Code:
#include <iostream>

using namespace std;

#define TEST cout << "Ist schon inkludiert" << endl;

#ifndef _CSTDLIB_
#ifdef TEST
#undef TEST
#endif
#define TEST cout << "Ist NICHT inkludiert" << endl;
#endif

int main(void)
{

	TEST

	return 0;
}
erstellt habe und beim ausführen steht dort, dass cstdlib bereits inkludiert wurde (aber halt nicht von mir :/ ).
Entweder wird es durch iostream oder durch VS 2012 inkludiert... wäre nett wenn jemand ne lösung weiß wie ich das ausschalten kann, da das fürs lernen echt bissle blöd ist.
08/10/2012 18:03 MrSm!th#6
Ob cstdlib eingebunden wird, weiß ich nicht, versuch es doch mit etwas eindeutigem wie std::string.
Wenn der Typ bekannt ist, bindet dein VS die Header wohl automatisch ein.

Also ich fände das sehr angenehm, wenn mein VS das täte.
08/10/2012 18:36 kissein#7
Quote:
Originally Posted by -Epitaph- View Post
Mir ist aufgefallen, dass ich, ohne bestimmte Headerdateien einzubinden, manchmal trotzdem Objekte und Funktionen nutzen kann wie z.B. cout aus iostream oder exit() bzw. abort() aus cstdlib/stdlib.h.

Kann's vielleicht sein, dass VS 2012 die automatisch lädt?
Microsoft hat mit VS2012 seit Augenmerk wieder etwas mehr auf C++ gerichtet was ja in den letzten Jahren mit dem .Net etwas untergegangen ist und möchte unter anderem die Produktivität in C++ weiter erhöhen. Wird wohl noch weitere Featurepacks hierfür von Microsoft geben.

Gab hierzu mehrere direkte/indirekte Statements auf dem "C++Day in Bad Homburg"
08/10/2012 22:46 -Epitaph-#8
Quote:
Originally Posted by MrSm!th View Post
Ob cstdlib eingebunden wird, weiß ich nicht, versuch es doch mit etwas eindeutigem wie std::string.
Wenn der Typ bekannt ist, bindet dein VS die Header wohl automatisch ein.

Also ich fände das sehr angenehm, wenn mein VS das täte.
Also ich kann nen string ohne die headerdatei aber mit dem namespace deklarieren und initialisieren aber nicht über cout ausgeben.
Vielleicht bild ich mir auch nur was ein... Das erste mal als mir das aufgefallen ist, war als im Buch als Aufgabe stand, dass ich den namespace std weglassen und dann die Ausgabe mit cout testen sollte und das hat dann ohne den namespace funktioniert... hab dann auch noch glaub ich die headerdatei entfernt und es hat geklappt. In nem neuem Projekt dann allerdings nimmer... Und nu stand in nem andren Buch dass man für abort()/exit() cstdlib inkludieren müsste aber es geht auch ohne.
Vielleicht isses nur nen Fehler im Buch oder es liegt an den neuen Compilern.
kam mir halt nur bissle komisch vor.
Aber was solls ^^

Trotzdem danke für die Antworten ;)
08/10/2012 23:08 MrSm!th#9
Also wenn du ohne explizite Namensauflösung cout verwenden kannst, ist das definitiv ein Fehler.
Entweder musst du über eine using/using namespace direktive den Namensraum angeben oder halt std::cout, aber ganz ohne geht nicht, das widerspricht dem Standard.

Das mit dem String hab ich nicht verstanden.