c

C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll.
5
Antworten

So prüfen Sie, ob zwei Dateinamen auf dieselbe physische Datei verweisen

Ich habe ein Programm, das zwei Dateinamen als Argumente akzeptiert: Es liest die erste Datei, um die zweite Datei zu erstellen. Wie kann ich sicherstellen, dass das Programm die erste Datei nicht überschreibt? Einschränkungen: Die Method...
11.01.2010, 13:31
9
Antworten

Was sind überzeugende Beispiele, in denen die Zeigerarithmetik der Array-Subskribierung vorzuziehen ist?

Ich bereite einige Folien für eine einführende C-Klasse vor, und ich versuche, gute Beispiele (und Motivation) für die Verwendung von Zeigerarithmetik über Array-Subskriptionen zu präsentieren. Viele Beispiele, die ich in Büchern sehe, sind z...
28.03.2009, 17:19
5
Antworten

___ answer30817617 ___

Ihr Fall scheint ein Grenzfall zu sein, aber eine Include-Datei kann als eine Art Vertrag zwischen dieser Quelldatei und anderen Quelldateien angesehen werden, die diese Funktionen benötigen.

Indem Sie den "Vertrag" in eine Header-Datei schreiben, können Sie sicherstellen, dass die anderen Quelldateien wissen, wie diese Funktionen aufgerufen werden, oder Sie werden vielmehr sicher sein, dass der Compiler eingefügt wird der richtige Code und überprüfen Sie seine Gültigkeit zum Zeitpunkt der Kompilierung.

Was aber, wenn Sie dann (versehentlich) den Funktionsprototyp in der entsprechenden Quelldatei geändert haben?

Indem Sie in diese Datei den gleichen Header wie alle anderen einfügen, werden Sie bei der Kompilierung gewarnt, sollte eine Änderung versehentlich den Vertrag "brechen".

Update (aus @ tmlens Kommentar): Auch wenn dies nicht der Fall ist, kann eine Include-Datei auch Deklarationen und Pragmas wie #defines, typedef, enum, struct und inline verwenden als Compiler-Makros würde es keinen Sinn machen, mehr als einmal zu schreiben (eigentlich wäre das gefährlich an zwei verschiedenen Stellen zu schreiben, damit die Kopien nicht mit schlechten Ergebnissen zusammenfallen). Einige davon (z. B. ein Pragma-Struktur-Pragma ) könnten zu schwer zu erkennenden Fehlern werden.

    
___ answer30819602 ___

Dies ist nützlich, weil Funktionen deklariert werden können, bevor sie definiert werden.

So kommt es, dass Sie die Deklaration haben, gefolgt von einem Aufruf \ Aufruf, gefolgt von der Implementierung. Das musst du nicht, aber du kannst es.

Die Header-Datei enthält die Deklarationen. Sie können jederzeit aufrufen, solange der Prototyp übereinstimmt. Und solange der Compiler vor dem Kompilieren eine Implementierung findet.

    
___ qstntxt ___

Ich verstehe, dass wenn eine Quelldatei Funktionen aus einer anderen Datei referenzieren muss, sie ihre Header-Datei enthalten muss, aber ich verstehe nicht, warum die Quelldatei eine eigene Header-Datei enthält. Der Inhalt in der Header-Datei wird einfach kopiert und als Funktionsdeklaration in die Quelldatei eingefügt. Für Quelldatei, die eine eigene Header-Datei, eine solche "Deklaration" scheint mir nicht notwendig, in der Tat, Projekt noch kompilieren und verknüpfen kein Problem nach dem Entfernen der Header aus der Quelldatei, so was ist der Grund für die Quelldatei gehören eigene Kopfzeile?

    
___ answer30817652 ___

Der Hauptvorteil besteht darin, dass der Compiler die Konsistenz Ihrer Kopfzeile und ihrer Implementierung überprüft. Sie tun es, weil es bequem ist, nicht weil es erforderlich ist. Es kann durchaus möglich sein, das Projekt ohne diese Einbeziehung korrekt kompilieren und ausführen zu lassen, aber es kompliziert die Wartung Ihres Projekts auf lange Sicht.

Wenn Ihre Datei keine eigene Kopfzeile enthält, können Sie versehentlich in eine Situation geraten, in der die Vorwärtsdeklaration einer Funktion nicht mit der Definition der Funktion übereinstimmt - vielleicht weil Sie einen Parameter hinzugefügt oder entfernt haben und vergessen haben, die Kopfzeile zu aktualisieren . Wenn dies geschieht, würde der Code, der auf der Funktion mit Nichtübereinstimmung beruht, noch kompilieren, aber der Aufruf würde zu undefiniertem Verhalten führen. Es ist viel besser, wenn der Compiler diesen Fehler findet, was automatisch geschieht, wenn Ihre Quelldatei eine eigene Kopfzeile enthält.

    
___ tag123headerfiles ___ Header-Dateien werden in einigen Programmiersprachen verwendet, um Quellcode als eine einzelne Kopie zu speichern, die in mehreren Quelldateien wiederverwendet werden kann. Dieses Tag sollte für Fragen zur Verwendung von Header-Dateien verwendet werden. Ein Tag für die Programmiersprache wie C, C ++, PHP oder Ruby sollte zusammen mit diesem Tag verwendet werden, da die Verwendung der Header-Datei zwischen Programmiersprachen variieren kann. Dieses Tag wird normalerweise nicht mit der Java- oder Go-Programmierung und der Import-Anweisung verwendet. ___ tag123c ___ C ist eine universelle Computerprogrammiersprache, die für Betriebssysteme, Bibliotheken, Spiele und andere Hochleistungsanwendungen verwendet wird. Dieses Tag sollte bei allgemeinen Fragen zur C-Sprache verwendet werden, wie in der Norm ISO 9899: 2011 definiert. Fügen Sie ggf. ein versionsspezifisches Tag wie c99 oder c90 für Fragen zu älteren Sprachstandards hinzu. C unterscheidet sich von C ++ und es sollte nicht mit dem C ++ - Tag kombiniert werden, wenn ein rationaler Grund fehlt. ___ answer30822348 ___

Praktisches Beispiel - gehen Sie von folgenden Dateien in einem Projekt aus:

%Vor%

Beachten Sie, dass die Deklaration in %code% nicht mit der Definition in %code% übereinstimmt; Die Rückgabetypen sind unterschiedlich. %code% ruft die Funktion %code% auf, vorausgesetzt, sie gibt eine %code% gemäß der Deklaration in %code% zurück.

%code% und %code% werden getrennt voneinander kompiliert. Da %code% %code% wie in %code% deklariert, kompiliert es erfolgreich. Da %code% nicht %code% enthält, ist dem Compiler der Typkonflikt zwischen der Deklaration und der Definition nicht bekannt, so dass er ebenfalls erfolgreich kompiliert wird.

Wenn Sie die beiden Objektdateien miteinander verknüpfen, stimmt der Maschinencode für den Funktionsaufruf nicht mit dem überein, was der Maschinencode für die Funktionsdefinition erwartet. Der Funktionsaufruf erwartet, dass ein %code% -Wert zurückgegeben wird, aber die Funktionsdefinition gibt %code% zurück. Dies ist ein Problem, insbesondere wenn die beiden Typen nicht die gleiche Größe haben. Im besten Fall erhalten Sie ein Müll-Ergebnis.

Wenn Sie %code% in %code% einfügen, kann der Compiler diese Abweichung erkennen, bevor Sie Ihr Programm ausführen.

Und, wie in einer früheren Antwort darauf hingewiesen wird, wenn %code% irgendwelche Typen oder Konstanten definiert, die von %code% verwendet werden, dann müssen Sie sie definitiv einbeziehen.

    
___ tag123declaration ___ Deklaration ist der Teil des Unterprogramms (Prozedur oder Funktion), der das Protokoll (Header) liefert, aber nicht den Rumpf des Unterprogramms. ___ answer30817605 ___

Die Header-Datei sagt den Leuten, was die Quelldatei tun kann.

Also muss die Quelldatei für die Headerdatei ihre Verpflichtungen kennen. Deshalb ist es enthalten.

    
___

Ich verstehe, dass wenn eine Quelldatei Funktionen aus einer anderen Datei referenzieren muss, sie ihre Header-Datei enthalten muss, aber ich verstehe nicht, warum die Quelldatei eine eigene Header-Datei enthält. Der Inhalt in der Header-Datei w...
13.06.2015, 10:23
5
Antworten

strcat () für formatierte Strings

Ich baue eine Saite Stück für Stück in meinem Programm und benutze derzeit eine Mischung aus strcat (), wenn ich eine einfache Zeichenfolge am Ende hinzufüge, aber wenn ich eine formatierte Zeichenfolge hinzufüge, verwende ich sprintf ( ) zB:...
24.12.2012, 15:19
7
Antworten

Summe von zwei Zeichen in C / C ++

In C / C ++, wenn ich die Summe von zwei Zeichen finden möchte - ich bekomme das Ergebnis in int. Zum Beispiel: %Vor% Druckt %Vor% Warum?     
19.10.2013, 21:15
4
Antworten

Was macht ein C-Cast wirklich?

Ich schreibe mehr und mehr C-Anwendungen, und jetzt frage ich mich etwas über Guss. In C ++ ist eine dynamische Besetzung eine sehr kostspielige Operation (zum Beispiel ein Downcast), aber ich weiß nicht einmal, ob es sich um eine statische hand...
06.12.2012, 14:50
5
Antworten

Funktionsadresse in libc?

Ich versuche die Adresse (in hex) der Funktion exit() in libc zu erhalten, aber ich bin mir nicht sicher wo und wie ich sie finde. Jeder kennt den Weg, um es zu finden, bitte teilen Sie eine Idee. Danke!     
08.03.2013, 19:37
3
Antworten

So verknüpfen Sie mehrere Implementierungsdateien in C

Ich habe eine Reihe von .c -Dateien, d. h. die Implementierungsdateien sagen main.c A.c B.c Wo Funktionen von irgendeiner der Dateien irgendeine Funktion von einer anderen Datei aufrufen können. Meine Frage ist, brauche ich eine ....
25.03.2013, 18:46
3
Antworten

Fehler: "erwartet" ('vor String-Konstante'

Arbeiten zur Berechnung des geometrischen Mittelwerts von Werten in einem Array Die Funktion sollte die Geo-Mittel richtig berechnen, aber ich bekomme eine seltsame Fehlermeldung %Vor%     
25.04.2012, 00:16
3
Antworten

Was ist der Unterschied zwischen memcpy () und strncpy (), da Letzterer leicht ein Ersatz für Ersteres sein kann?

Was ist der signifikante Unterschied zwischen memcpy() und strncpy() ? Ich frage das, weil wir einfach strncpy() ändern können, um beliebige Daten zu kopieren, nicht nur Zeichen, einfach indem wir die ersten zwei nicht char* Argumente...
14.05.2013, 21:36