getline () in C ++ - _GNU_SOURCE nicht benötigt?
Frage
Zum einen bin ich ziemlich neu in C ++. Ich glaube, dass getline()
ist kein Standard-C-Funktion, so #define _GNU_SOURCE
erforderlich ist, es zu benutzen. Ich bin jetzt mit C ++ und g ++ mir das _GNU_SOURCE
erzählt ist bereits definiert:
$ g++ -Wall -Werror parser.cpp
parser.cpp:1:1: error: "_GNU_SOURCE" redefined
<command-line>: error: this is the location of the previous definition
Kann jemand bestätigen, wenn diese Norm ist oder seine Definition irgendwo in meinem Setup versteckt? Ich bin mir nicht sicher, ob die Bedeutung der letzten Zeile angegeben.
Die Die Datei enthält wie folgt, so vermutlich wird es in einem oder mehreren dieser definiert?
#include <iostream>
#include <string>
#include <cctype>
#include <cstdlib>
#include <list>
#include <sstream>
Danke!
Lösung
Ich denke, g ++, ab Version 3, automagically _GNU_SOURCE
definiert. Dies wird durch Ihre dritte Zeile in dem Fehler unterstützt die besagt, dass die erste Definition auf der Kommandozeile wurde (mit nary einem -D_GNU_SOURCE
in Sicht):
<command-line>: error: this is the location of the previous definition
Wenn Sie es nicht wollen, #undef
es als die erste Zeile in der Übersetzungseinheit. Sie können es brauchen, aber in diesem Fall Gebrauch:
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
Der Grund, warum Sie die Fehler sind immer ist, weil Sie neu zu definieren es. Es sollte kein Fehler sein, wenn Sie es zu definieren, was es ohnehin schon war. Zumindest ist das der Fall bei C, kann es mit C ++ unterschiedlich sein. Auf der Basis der GNU-Header, würde ich sagen, dass sie eine implizite -D_GNU_SOURCE=1
tun, weshalb es davon ausgeht, dass Neudefinition es auf etwas anderes.
Das folgende Snippet sollten Sie seinen Wert sagen, sofern Sie es nicht geändert haben.
#define DBG(x) printf ("_GNU_SOURCE = [" #x "]\n")
DBG(_GNU_SOURCE); // first line in main.
Andere Tipps
Ich hatte schon immer eine der folgenden in C ++ zu verwenden. Nie musste vor _GNU_ etwas erklären. Ich in der Regel in * nix laufen, so dass ich in der Regel gcc und g ++ als auch.
string s = cin.getline()
char c;
cin.getchar(&c);
Getline ist Standard es auf zwei Arten definiert ist.
Sie können es als eine Elementfunktion von einem der Ströme wie folgt aufrufen:
Dies ist die Version definiert in
//the first parameter is the cstring to accept the data
//the second parameter is the maximum number of characters to read
//(including the terminating null character)
//the final parameter is an optional delimeter character that is by default '\n'
char buffer[100];
std::cin.getline(buffer, 100, '\n');
oder können Sie die Version in
definiert verwenden//the first parameter is the stream to retrieve the data from
//the second parameter is the string to accept the data
//the third parameter is the delimeter character that is by default set to '\n'
std::string buffer;
std::getline(std::cin, buffer,'\n');
für weitere Referenz http://www.cplusplus.com/reference/iostream/istream/getline. html http://www.cplusplus.com/reference/string/getline.html