"ফাইলের শেষে কোনও নিউলাইন নেই" সংকলক সতর্কতা


187

কিছু সি ++ কম্পাইলারগুলিতে নিম্নলিখিত সতর্কতার কারণ কী?

ফাইলের শেষে কোনও নিউলাইন নেই

উত্স / শিরোনাম ফাইলের শেষে আমার খালি লাইনটি কেন থাকবে?


17
আসলে কারণ নয়, তবে এটি খুব বিরক্তিকর যদি আপনি catকোনও ফাইল হন এবং এটির পেছনের নতুন লাইন না থাকে কারণ ফাইলের শেষ লাইনের পরে নতুন শেল প্রম্পট প্রদর্শিত হবে (যেমন কলাম 0 নয়)
থিফমাস্টার

@ থিফমাস্টার আমার $ পিএস 1 সেই কারণেই একটি নতুন লাইন দিয়ে শুরু হয়। (এটি যাইহোক, একাধিক লাইন প্রম্পট, এতে একটি লাইনে দরকারী তথ্যের একটি গুচ্ছ রয়েছে এবং তারপরে একটি প্রম্পট চরিত্র ছাড়া আর কিছুই নয় যাতে মোটামুটি দীর্ঘ কমান্ডগুলি মোড়ানো না হয়)
বেমস 5৩

7
Why should I have an empty line at the end of a source/header file- যদি কোনও পাঠ্য ফাইল থাকে one\ntwo\nthree\nতবে এতে তিনটি লাইন রয়েছে, যার কোনওটিই খালি নয়। যদি কোনও পাঠ্য ফাইল থাকে one\ntwo\nthreeতবে এটি কোনও পাঠ্য ফাইল নয়, একই অর্থে শেষের দিকে পুরো স্টপ ছাড়া বাক্যটি কোনও বাক্য নয়।
ব্র্যান্ডিন

উত্তর:


217

কোনও নতুন লাইন না থাকলে কিছু সমস্যা দেখা দিতে পারে। এএনএসআই স্ট্যান্ডার্ড অনুসারে #includeকোনও ফাইলের শুরুতে ফাইলটি ঠিক ঠিক ঠিক যেমন ফাইলের সামনের অংশে সন্নিবেশ করায় #include <foo.h>এবং ফাইলের বিষয়বস্তুর পরে নতুন লাইন প্রবেশ করায় না । সুতরাং আপনি যদি পার্সারের শেষে কোনও নিউলাইনবিহীন কোনও ফাইল অন্তর্ভুক্ত করেন তবে এটি দেখা যাবে যে শেষ লাইনের foo.hপ্রথম লাইনটি প্রথম লাইনের মতো একই লাইনে রয়েছে foo.cpp। Foo.h এর শেষ লাইনটি যদি কোনও নতুন লাইন ছাড়াই মন্তব্য করে? এখন প্রথম লাইন foo.cppমন্তব্য করা হয়। এগুলি ক্রাইপ হতে পারে এমন সমস্যাগুলির কয়েকটি উদাহরণ just


কেবল কোনও আগ্রহী পক্ষকে নীচে জেমসের উত্তরের দিকে নির্দেশ করতে চেয়েছি। উপরের উত্তরটি এখনও সি এর জন্য সঠিক, নতুন সি ++ স্ট্যান্ডার্ড (সি ++ 11) পরিবর্তন করা হয়েছে যাতে সি ++ এবং সি ++ 11 অনুসারে একটি সংকলক ব্যবহার করা হলে এই সতর্কতা আর দেওয়া হবে না।

জেমসের পোস্টের মাধ্যমে সি ++ 11 স্ট্যান্ডার্ড থেকে:

একটি উত্স ফাইল যা খালি নয় এবং এটি একটি নতুন-লাইন অক্ষরে শেষ হয় না, বা যে কোনও নতুন পংক্তির অক্ষরটি অবিলম্বে ব্যাকস্ল্যাশ অক্ষর দ্বারা শেষ হয়ে যায় এর আগে এমন কোনও স্প্লাইকিং হওয়ার আগে প্রক্রিয়া করা হবে যেন অতিরিক্ত নতুন- লাইন অক্ষরটি ফাইলটিতে সংযুক্ত করা হয়েছিল (সি ++ 11 §2.2 / 1)।


28
অবশ্যই অনুশীলনে প্রতিটি সংকলক # অন্তর্ভুক্তির পরে একটি নতুন লাইন যুক্ত করে। সৌভাগ্যক্রমে।
এমএসসিএল

3
আমি মনে করি মাইক্রোসফ্ট ভিজ্যুয়াল সি ++ (যেমন 2.x বা কিছু) এর পুরানো সংস্করণটি হুবহু এই সমস্যা ছিল। এটি আরও বেড়ে গেছে কারণ আইডিই সম্পাদক এই ধরণের অনুপস্থিত-নিউলাইন আচরণকে উত্সাহিত করেছিলেন।
গ্রেগ হিউগিল

2
সংকলকগণ বর্তমানে অভিযোগ নাও করতে পারেন, তবে গিটহব আসলে তা করেন।
পাইওভার

1
আমি জেমসের "নীচের" উত্তরটি দেখতে পাচ্ছি কিন্তু: "উপরের উত্তর" অর্ডারবাইতে কী ?! উপরে প্রশ্নটি রয়েছে, যেমন আমি সাধারণত ভোট দিয়ে অর্ডার করি। না আপনি নিজের উত্তরটি বোঝাতে চান?
এমবিএক্স

@ থমাস: এই প্রোগ্রামটি কি অপরিজ্ঞাত আচরণের জন্য আহ্বান জানায় কারণ এটি নতুন লাইনের সাথে শেষ হয় না। প্রোগ্রামটি এখানে দেখুন: ideone.com/jswwf9
ধ্বংসকারী

44

প্রতিটি উত্স ফাইল নন-পলাতক নিউলাইনের সাথে শেষ হওয়া প্রয়োজন সি ++ 11 এ মুছে ফেলা হয়েছে। স্পেসিফিকেশন এখন পড়ে:

একটি উত্স ফাইল যা খালি নয় এবং এটি একটি নতুন-লাইন অক্ষরে শেষ হয় না, বা যে কোনও নতুন পংক্তির অক্ষরটি অবিলম্বে ব্যাকস্ল্যাশ অক্ষর দ্বারা শেষ হয়ে যায় এর আগে এমন কোনও স্প্লাইকিং হওয়ার আগে প্রক্রিয়া করা হবে যেন অতিরিক্ত নতুন- লাইন অক্ষরটি ফাইলটিতে সংযুক্ত করা হয়েছিল (সি ++ 11 §2.2 / 1)।

একটি সংমিশ্রিত সংকলক আর এই সতর্কতা জারি করা উচিত নয় (কমপক্ষে সি ++ 11 মোডে সংকলন করার সময় নয়, যদি সংকলকটির ভাষা স্পেসিফিকেশনের বিভিন্ন সংশোধনগুলির জন্য মোড থাকে)।


4
সি +++ এর জন্য এটি বেশ ভাল এবং ভাল; দুর্ভাগ্যক্রমে, সি এখনও এটি ইউবি বলে, এমনকি আসন্ন সি 1 এক্স স্ট্যান্ডার্ডের সর্বশেষ খসড়াতে।
অ্যাডাম রোজেনফিল্ড

11
এই প্রশ্নটি [সি ++] ট্যাগ এবং [সি] নয়।
জেমস ম্যাকনেলিস

3
তবুও, এটি সম্ভবত ট্যাগ করা উচিত [সি], যেহেতু সি এই সতর্কতার সন্ধানকারী অনেক লোক এখানে তাদের পথ খুঁজে পাবে।
অ্যাডাম রোজেনফিল্ড

1
এটি যোগ করার জন্য এখনও একটি ভাল পয়েন্ট। উপরে এটি যোগ করা হচ্ছে। আশা করি আপত্তি করবেন না।
টিজে সিব্রুকস

25

সি ++ 03 স্ট্যান্ডার্ড [2.1.1.2] ঘোষণা করে:

... যদি কোনও উত্স ফাইল যা খালি না থাকে তবে যদি কোনও নতুন-লাইন চরিত্রের শেষ না হয় বা তত্ক্ষণাত কোনও নতুন লাইন চরিত্রের সাথে শেষ হয় যেমন কোনও স্প্ল্যাসিংয়ের আগে ব্যাকস্ল্যাশ অক্ষর দ্বারা পূর্ববর্তী হয়, আচরণটি অনির্ধারিত।


16

"আনুগত্যকারী" এর উত্তর হ'ল কারণ সি ++ 03 স্ট্যান্ডার্ড বলছে যে নতুন প্রোগ্রামে শেষ না হওয়া কোনও প্রোগ্রামের আচরণ অপরিজ্ঞাত "(প্যারাফ্রেসড)।

কৌতূহলের উত্তর এখানে: http://gcc.gnu.org/ML/gcc/2001-07/msg01120.html


4
আহ, প্রিয় "অপরিবর্তিত আচরণ"। যখন অন্যান্য ভাষা ব্যর্থ হয়, সি / সি ++ "অপরিজ্ঞাত" উপায়ে আচরণ করে :) এটি অবশ্যই তাদের মনোমুগ্ধের একটি বড় অংশ। এবং আমি মজা করছি না।
শাইলেন্ট

6

এটি কোনও ফাঁকা রেখার কথা উল্লেখ করে না, এটি একটি শেষ লাইনের (যা এতে সামগ্রী থাকতে পারে) একটি নতুন লাইন দিয়ে সমাপ্ত হয় কিনা।

বেশিরভাগ পাঠ্য সম্পাদকরা কোনও ফাইলের শেষ লাইনের শেষে একটি নতুন লাইন রাখবেন, সুতরাং শেষ লাইনে যদি একটি না থাকে, তবে ফাইলটি কেটে ফেলা হয়েছে বলে ঝুঁকি রয়েছে। তবে, আপনি নতুন লাইনটি নাও পেতে পারেন এমন বৈধ কারণ রয়েছে তাই এটি কেবল একটি সতর্কতা, ত্রুটি নয়।


5

#includeফাইলটির আক্ষরিক বিষয়বস্তুগুলির সাথে এর লাইনটি প্রতিস্থাপন করবে। ফাইলটি যদি কোনও নতুন লাইনের সাথে শেষ না হয় তবে এতে #includeযে রেখাটি এটি টেনেছিল সেগুলি পরবর্তী লাইনের সাথে মিশে যাবে।


2

আমি সি-ফ্রি আইডিই সংস্করণ ৫.০ ব্যবহার করছি, আমার প্রোগ্রামে 'সি ++' বা 'সি' ভাষার যে কোনও একটিরই আমার সমস্যা হচ্ছিল the প্রোগ্রামের শেষে যেমন প্রোগ্রামের শেষ লাইন (ফাংশনটির ধনুর্বন্ধনী পরে এটি হতে পারে) প্রধান বা যে কোনও ফাংশন), এন্টার -লাইন নং টিপুন । একই প্রোগ্রামটি সম্পাদন করে ১. দ্বারা বৃদ্ধি করা হবে, এটি ত্রুটি ছাড়াই চলবে।


2

অবশ্যই অনুশীলনে প্রতিটি সংকলক # অন্তর্ভুক্তির পরে একটি নতুন লাইন যুক্ত করে। সৌভাগ্যক্রমে। - @ এমএক্সসিএল

নির্দিষ্ট সি / সি ++ নয় তবে একটি সি GL_ARB_shading_language_includeডায়ালিক: এক্সটেনশনটি ব্যবহার করার সময় ওএস এক্স-এর জিএসএসএল সংকলক আপনাকে মিস করা নিউলাইন সম্পর্কে সতর্ক করে না । সুতরাং আপনি MyHeader.hএকটি হেডার গার্ডের সাথে একটি ফাইল লিখতে পারেন যা শেষ হয় #endif // __MY_HEADER_H__এবং আপনি অবশ্যই লাইনটি হারাবেন #include "MyHeader.h"


2

কারণ ফাইলটি নতুন-লাইনের সাথে শেষ না হলে সি / সি ++ সংস্করণের মধ্যে আচরণের পার্থক্য রয়েছে। বিশেষত দুষ্টু পুরানো সি ++ - সংস্করণগুলি, সিএফ ++ 03 এফএক্স স্ট্যান্ডার্ড বলেছেন (অনুবাদ পর্যায়ের পর্যায়):

যদি খালি নয় এমন উত্স ফাইলটি কোনও নতুন-লাইন অক্ষরে শেষ না হয় বা ব্যাকস্ল্যাশ অক্ষরের তাত্ক্ষণিকভাবে একটি নতুন-লাইন অক্ষরে শেষ হয় তবে আচরণটি অপরিবর্তিত।

অপরিজ্ঞাত আচরণটি খারাপ: একটি আদর্শ অনুসারে সংকলক এখানে যা চায় তা কমবেশি করতে পারে (দূষিত কোড বা যাই হোক না কেন sertোকান) - স্পষ্টভাবে সতর্কতার কারণ।

সি ++ ১১-এ পরিস্থিতি আরও ভাল হলেও এমন পরিস্থিতি এড়ানো ভাল ধারণা যেখানে পূর্ববর্তী সংস্করণগুলিতে আচরণের সংজ্ঞা দেওয়া হয়নি। সি ++ 03 স্পেসিফিকেশন সি 99 এর চেয়েও খারাপ যা সম্পূর্ণরূপে এই জাতীয় ফাইলগুলি নিষিদ্ধ করে (আচরণটি তখন সংজ্ঞায়িত করা হয়)।


আমি সন্দেহ করি স্ট্যান্ডার্ড বলেছিল যে নতুন লাইনটি অনুসরণ না করা প্রোগ্রামগুলি অপরিবর্তিত আচরণের পরিবর্তে এগুলি নির্ধারণের পরিবর্তে বলা হয়েছে, কারণ কিছু সংকলক #includeনির্দেশনার পরে উত্স কোড পাঠ্য সহ একটি অন্তর্ভুক্ত ফাইলের একটি চূড়ান্ত-চূড়ান্ত চূড়ান্ত লাইনকে সম্মতিযুক্ত করবেন , এবং এমন কিছু সংকলককে লক্ষ্য করে কিছু প্রোগ্রামাররা এ জাতীয় আচরণটি ব্যবহার করতে পারে। স্ট্যান্ডার্ড এ জাতীয় জিনিসগুলি অপরিবর্তিত রাখার ফলে এই জাতীয় কেরিকগুলি শোষণকারী প্রোগ্রামগুলি প্ল্যাটফর্মগুলিতে এই জাতীয় আচরণ নির্দিষ্ট করে যাতে এটি সংজ্ঞায়িত হয়। স্ট্যান্ডার্ড ম্যান্ডেট থাকার কারণে এই ধরনের প্রোগ্রামগুলি ভেঙে যায়।
ক্যাট

0

এই সতর্কতাটি কোনও ফাইল কেটে কেটে ফেলা হতে পারে তা বোঝাতেও সহায়তা করতে পারে। এটি সত্য যে সংকলক সম্ভবত যেভাবেই কোনও সংকলক ত্রুটি ছুঁড়ে ফেলবে - বিশেষত যদি এটি কোনও ফাংশনের মাঝামাঝি হয় - অথবা সম্ভবত কোনও লিঙ্কার ত্রুটি হয় তবে এগুলি আরও ক্রিপ্টিক হতে পারে এবং এটি হওয়ার নিশ্চয়তা নেই।

অবশ্যই এই সতর্কতাটির গ্যারান্টিযুক্তও নয় যদি ফাইলটি একটি নতুন লাইনের পরে অবিলম্বে কেটে ফেলা হয় তবে এটি এখনও কিছু ত্রুটিগুলি পেতে পারে যা অন্যান্য ত্রুটিগুলি মিস করতে পারে এবং সমস্যাটিকে আরও শক্তিশালী ইঙ্গিত দেয়।


-2

এটি কোনও ত্রুটি নয়। এটি কেবল একটি সতর্কতা।

সম্পাদককে ফাইলটি খুলুন, ফাইলের শেষ লাইনে যান এবং ফাইলের শেষে একটি ফাঁকা লাইন যুক্ত করতে এন্টার টিপুন।

যদিও এর বাইরেও আপনার #include <iostream>পরিবর্তে ব্যবহার করা উচিত <iostream.h>। তারপরে using std::cout;এটি পরে রাখুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.