3

首先,我对 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>

谢谢!

4

3 回答 3

5

我认为从版本 3 开始的 g++ 会自动定义_GNU_SOURCE. 错误中的第三行支持这一点,指出第一个定义是在命令行上完成的(-D_GNU_SOURCE看不到 a ):

<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.
于 2009-02-18T01:16:35.673 回答
0

我一直不得不在 C++ 中使用以下之一。以前从来不需要声明 _GNU_ 任何东西。我通常在 *nix 中运行,所以我通常也使用 gcc 和 g++。

string s = cin.getline()

char c;
cin.getchar(&c);
于 2009-02-18T01:12:23.547 回答
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

于 2009-02-18T03:01:59.853 回答