C ++中的getline() - 不需要_GNU_SOURCE?

时间:2009-02-18 01:09:17

标签: c++ getline

首先,我对C ++很陌生。我认为getline()不是标准的C函数,因此使用它需要#define _GNU_SOURCE。我现在正在使用C ++,g ++告诉我_GNU_SOURCE已经定义:

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

任何人都可以确认这是标准的,还是隐藏在我的设置中的某个地方?我不确定所引用的最后一行的含义。

文件的包含如下,所以可能是在一个或多个中定义的?

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

谢谢!

3 个答案:

答案 0 :(得分:5)

我认为g ++从版本3开始自动定义_GNU_SOURCE。这个错误的第三行支持这一点,说明第一个定义是在命令行上完成的(看到了-D_GNU_SOURCE

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

如果你不想要它,#undef它就是编译单元的第一行。但是,您可能需要它,在这种情况下使用:

#ifndef _GNU_SOURCE
    #define _GNU_SOURCE
#endif

您收到错误的原因是因为您正在重新定义它。如果将其定义为已有的,则不应该是错误。至少在C的情况下,它可能与C ++不同。基于GNU标题,我会说他们正在做一个隐含的-D_GNU_SOURCE=1,这就是为什么它认为你重新定义它的原因。

如果您没有更改它,以下代码段应该告诉您它的值。

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

答案 1 :(得分:0)

我总是不得不在C ++中使用以下之一。从来没有必要申报_GNU_。我通常在* nix中运行所以我通常也使用gcc和g ++。

string s = cin.getline()

char c;
cin.getchar(&c);

答案 2 :(得分:0)

Getline是标准的,它以两种方式定义 您可以将其称为流之一的成员函数,如下所示: 这是

中定义的版本
//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');

或者您可以使用

中定义的版本
//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');

供进一步参考 http://www.cplusplus.com/reference/iostream/istream/getline.html http://www.cplusplus.com/reference/string/getline.html