No necesita _GNU_SOURCE - getline () en C ++?
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!
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