Domanda

In primo luogo, io sono abbastanza nuovo per C ++. Credo che getline() non è una funzione standard C, in modo da #define _GNU_SOURCE è necessario per utilizzare esso. Ora sto utilizzando C ++ e g ++ mi dice che _GNU_SOURCE è già definito:

$ g++ -Wall -Werror parser.cpp
parser.cpp:1:1: error: "_GNU_SOURCE" redefined
<command-line>: error: this is the location of the previous definition

Qualcuno può confermare se questo è normale, o è la sua definizione nascosto da qualche parte nella mia messa a punto? Non sono sicuro del significato della linea finale citato.

include del file sono i seguenti, quindi presumibilmente è definito in uno o più di questi?

#include <iostream>
#include <string>
#include <cctype>
#include <cstdlib>
#include <list>
#include <sstream>

Grazie!

È stato utile?

Soluzione

Credo g ++, a partire dalla versione 3, definisce automagicamente _GNU_SOURCE. Questo è supportato dalla terza linea in errore che informa che la prima definizione è stato fatto sulla riga di comando (con neanche un -D_GNU_SOURCE in vista):

<command-line>: error: this is the location of the previous definition

Se non lo vuoi, #undef come la prima linea nella vostra unità di compilazione. Potrebbe essere necessario, tuttavia, in cui l'uso caso:

#ifndef _GNU_SOURCE
    #define _GNU_SOURCE
#endif

Il motivo che stai ricevendo l'errore è perché si sta ri-definirlo. Non dovrebbe essere un errore se si definisce a quello che già era. Almeno questo è il caso con C, può essere diversa con C ++. Sulla base delle intestazioni GNU, direi che stanno facendo un -D_GNU_SOURCE=1 implicito che è il motivo per cui pensa che stai ridefinizione a qualcosa d'altro.

Il seguente frammento dovrebbe dirvi il suo valore a condizione che non hai cambiato.

#define DBG(x) printf ("_GNU_SOURCE = [" #x "]\n")
DBG(_GNU_SOURCE); // first line in main.

Altri suggerimenti

Ho sempre dovuto usare uno dei seguenti in C ++. Non ha mai avuto a dichiarare _GNU_ nulla prima. Io di solito eseguito in * nix così io di solito uso gcc e g ++ pure.

string s = cin.getline()

char c;
cin.getchar(&c);

GetLine è standard è definito in due modi.
Si può chiamare come una funzione membro di uno dei corsi d'acqua come segue: Questa è la versione definita 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');

oppure è possibile utilizzare la versione definita in

//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');

per ulteriore riferimento http://www.cplusplus.com/reference/iostream/istream/getline. html http://www.cplusplus.com/reference/string/getline.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top