Pregunta

En primer lugar, soy bastante nuevo en C ++. Creo que getline() no es una función estándar de C, por lo que se requiere #define _GNU_SOURCE usarlo. Ahora estoy usando C ++ y g ++ me dice que _GNU_SOURCE ya está definido:

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

¿Alguien puede confirmar si esto es normal, o se oculta su definición en algún lugar de mi configuración? No estoy seguro del significado de la última línea citada.

El archivo incluye son los siguientes, por lo que presumiblemente se define en uno o más de estos?

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

Gracias!

¿Fue útil?

Solución

Creo g ++, a partir de la versión 3, define automágicamente _GNU_SOURCE. Esto es apoyado por su tercera línea en el error que indica que la primera definición se llevó a cabo en la línea de comandos (sin el menor -D_GNU_SOURCE a la vista):

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

Si no lo quiere, #undef como la primera línea en su unidad de compilación. Es posible que sin embargo necesitan, en cuyo caso se utilizará:

#ifndef _GNU_SOURCE
    #define _GNU_SOURCE
#endif

La razón de que está recibiendo el error se debe a que está re-definirlo. No debe ser un error si se define a lo que ya era. Al menos ese es el caso con C, puede ser diferente con C ++. Con base en las cabeceras de GNU, diría que están haciendo un -D_GNU_SOURCE=1 implícita por lo que cree que estás redefinir a otra cosa.

El siguiente fragmento debe decirle su valor siempre y cuando no haya cambiado.

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

Otros consejos

Siempre he tenido que usar uno de los siguientes en C ++. Nunca tuvo que declarar _GNU_ nada antes. I generalmente se ejecuta en * nix por lo que suelen utilizar gcc y g ++ también.

string s = cin.getline()

char c;
cin.getchar(&c);

GetLine es estándar que se define de dos maneras.
Se le puede llamar como una función miembro de una de las corrientes de la siguiente manera: Esta es la versión definida en

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

o puede utilizar la versión definida en

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

para mayor referencia http://www.cplusplus.com/reference/iostream/istream/getline. html http://www.cplusplus.com/reference/string/getline.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top