سؤال

أولا، أنا جديد جدا على 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>

شكرا!

هل كانت مفيدة؟

المحلول

أعتقد G ++، من الإصدار 3، يعرف تلقائيا _GNU_SOURCE. وبعد يتم دعم ذلك من قبل سطرك الثالث في الخطأ الذي يفيد بأن التعريف الأول قد تم في سطر الأوامر (مع Nary A -D_GNU_SOURCE بصيرة):

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

إذا كنت لا تريد ذلك، #undef كما هو السطر الأول في وحدة الترجمة الخاصة بك. قد تحتاجها، ومع ذلك، في أي حالة تستخدم:

#ifndef _GNU_SOURCE
    #define _GNU_SOURCE
#endif

السبب في الحصول على الخطأ هو لأنك تقوم بإعادة تحديده. لا ينبغي أن يكون خطأ إذا حددته بما كان عليه بالفعل. على الأقل هذا هو الحال مع C، قد يكون مختلفا مع C ++. بناء على رؤوس جنو، أود أن أقول أنهم يقومون بضرورة ضمنية -D_GNU_SOURCE=1 وهذا هو السبب في أنه يعتقد أنك إعادة تحديد إلى شيء آخر.

يجب أن يخبرك المقتطف التالي بقيمتها المقدمة لم تتغيرها.

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

نصائح أخرى

كان علي دائما استخدام أحد الإجراءات التالية في C ++. لم يتعين أبدا إعلان _GNU_ أي شيء من قبل. عادة ما أشغل في * NIX، لذلك عادة ما أستخدم دول مجلس التعاون الخليجي و G ++ كذلك.

string s = cin.getline()

char c;
cin.getchar(&c);

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/iosstream/istream/getline.html. http://www.cplusplus.com/Reference/string/getline.html.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top