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!

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top