Question

Tout d'abord, je suis assez nouveau pour C ++. Je crois que getline() n'est pas une fonction standard C, donc #define _GNU_SOURCE est nécessaire pour l'utiliser. Je suis maintenant en C ++ et g ++ me dit que _GNU_SOURCE est déjà défini:

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

Quelqu'un peut-il confirmer si cela est standard, ou est sa définition cachée quelque part dans ma configuration? Je ne suis pas sûr du sens de la dernière ligne citée.

Le fichier comprend ce sont les suivantes, on peut donc supposer qu'il est défini dans l'une ou plusieurs de ces?

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

Merci!

Était-ce utile?

La solution

Je pense que g ++, à partir de la version 3, définit automagiquement _GNU_SOURCE. Ceci est soutenu par votre troisième ligne dans l'erreur indiquant que la première définition a été fait sur la ligne de commande (avec un -D_GNU_SOURCE en vue naire):

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

Si vous ne voulez pas, #undef comme la première ligne de votre unité de compilation. Vous devrez peut-être, cependant, dans ce cas, utilisez:

#ifndef _GNU_SOURCE
    #define _GNU_SOURCE
#endif

La raison pour laquelle vous obtenez l'erreur est parce que vous êtes re-définir. Il ne doit pas être une erreur si vous définissez à ce qu'il était déjà. Au moins, c'est le cas C, il peut être différent avec C ++. Sur la base des en-têtes GNU, je dirais qu'ils font un -D_GNU_SOURCE=1 implicite qui est pourquoi il pense que vous êtes redéfinissant à autre chose.

L'extrait suivant devrait vous dire sa valeur à condition que vous ne l'avez pas changé.

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

Autres conseils

J'ai toujours eu à utiliser l'un des éléments suivants en C ++. Jamais de déclarer quoi que ce soit _GNU_ avant. Je lance habituellement * nix donc je l'habitude d'utiliser gcc et g ++ ainsi.

string s = cin.getline()

char c;
cin.getchar(&c);

GetLine est standard, il est défini de deux façons.
Vous pouvez l'appeler en fonction de membre d'un des cours d'eau comme suit: Ceci est la version définie dans

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

ou vous pouvez utiliser la version définie dans

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

de renvoi en outre http://www.cplusplus.com/reference/iostream/istream/getline. html http://www.cplusplus.com/reference/string/getline.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top