কেন মূল () থেকে নুল ফিরিয়ে দিচ্ছেন?


10

আমি মাঝে মাঝে কোডারগুলি দেখতে পাই যা সি এবং সি ++ প্রোগ্রামগুলিতে NULLরিটার্ন মান হিসাবে ব্যবহৃত হয় main(), উদাহরণস্বরূপ এর মতো কিছু:

#include <stdio.h>

int main()
{
    printf("HelloWorld!");

    return NULL;
} 

আমি যখন এই সিসি কোডটি জিসিসি দিয়ে সংকলন করি তখন আমি এর সতর্কতা পাই:

সতর্কতা: রিটার্ন বিন্যাস ছাড়াই পয়েন্টার থেকে পূর্ণসংখ্যা তৈরি করে [-উইন্ট-রূপান্তর]

যা যুক্তিসঙ্গত কারণ ম্যাক্রোটি NULLপ্রসারিত হবে (void*) 0এবং মূলটির ফেরতের মান টাইপ হবে int

আমি যখন একটি সংক্ষিপ্ত সি ++ প্রোগ্রাম করি:

#include <iostream>
using namespace std;

int main()
{
    cout << "HelloWorld!";

    return NULL;
}

এবং এটি g ++ দিয়ে সংকলন করুন, আমি একটি সমতুল্য সতর্কতা পেয়েছি:

সতর্কতা: নূন-পয়েন্টার টাইপ 'ইন্ট' তে রূপান্তর করা হচ্ছে নুল [-উসকভারশন-নাল] থেকে

কিন্তু কেন তারা যখন কোনও সতর্কবার্তা ছুঁড়ে দেয় তখন কেন তারা NULLফেরতের মান হিসাবে ব্যবহার main()করবে? এটা কি শুধুই খারাপ কোডিং স্টাইল?


  • সতর্কতা থাকা সত্ত্বেও রিটার্ন মান হিসাবে ব্যবহার NULLকরার কারণ কী ?0main()
  • এটি প্রয়োগ-সংজ্ঞায়িত যদি এটি যথাযথ হয় বা না হয় এবং তবে যদি কোনও বাস্তবায়ন কেন পয়েন্টার মান ফিরে পেতে চাইবে?

4
আপনার সরাসরি তাদের জিজ্ঞাসা করা উচিত।
juanchopanza

5
"কেন তারা মূল ()" এর রিটার্ন মান হিসাবে NULL ব্যবহার করে - আমরা তা করি না। যে কোড লেখক না। কেন তাদের ন্যায্যতা প্রমাণে তাদের প্রয়াস শুনতে আগ্রহী ।
WhozCraig

1
@ মস্কো থেকে ভ্ল্যাড হ্যাঁ তবে আমাকে এটি পরীক্ষা করে দেখতে হয়েছিল যে এটি সত্যিই 0 ^^ - EXIT_FAILURE8,, এবং এটি 1 এর ব্যবহার ব্যর্থতার পক্ষে ভাল নয় কারণ এটি কিছু প্রোগ্রামে সাফল্যের জন্য ব্যবহৃত হয়েছিল।
ওয়ালমিও

2
@ রবার্টসম্পোর্টস মনিকাসেলিও যদি সত্যিই আপনার প্রতিক্রিয়াটি পেয়ে থাকে তবে তা দুঃখজনক। প্রথমত, এটি অর্থবোধ করে না (এটি অন্য কোথাও না বরং সর্বত্র থাকলে আরও বোধগম্য হবে )। দ্বিতীয়ত, এটি একটি বিক্রয় আউট। আপনি যদি কোডটি লিখছেন, আপনার এটির সঠিক কিনা তা সম্পর্কে আরও ভাল একটি কম্পাস থাকতে হবে; শুধু এটির সাথেই চলবে না কারণ এটিই মনে হয় যে এটি কারও দ্বারা করা হয়েছে। আপনার কাছে মনে হচ্ছে যে সূচটি সঠিক দিকে নির্দেশ করছে (সুতরাং আপনি কেন জিজ্ঞাসা করছেন); যে ব্যক্তি সেই কোডটি লিখেছিল তেমনটি নয়, তারপরে আপনাকে সেই কারণটি কেন খাওয়ানো হয়েছে।
WhozCraig

2
সি-তে, NULLপয়েন্টারটি 0(কোনও cast ালাই ছাড়াই void *) হিসাবে সংজ্ঞায়িত করা পুরোপুরি বৈধ । এই ক্ষেত্রে, ত্রুটি নজরে না যায় এবং একটি সতর্কতা উত্পন্ন করে না। এটি এখনও NUL ব্যবহার করা উচিত নয়।
Ctx

উত্তর:


14

যা যুক্তিসঙ্গত

হ্যাঁ.

কারণ ম্যাক্রো NULLপ্রসারিত হবে(void*) 0

না। সি ++ এ ম্যাক্রো NULL অবশ্যই(void*) 0 [সমর্থন.tyype.nullptr] এ প্রসারিত হবে না । এটি কেবল সি তে করতে পারে

উভয় ক্ষেত্রেই, এই মত কোড লেখা থেকে বিভ্রান্তিকর হয় NULLপড়ুন অনুমিত হয় নাল পয়েন্টার ধ্রুবক , তা কিভাবে বাস্তবায়ন হোক না কেন। এটির জায়গায় এটি ব্যবহার intকরা একটি যৌক্তিক ত্রুটি।

  • সতর্কতা থাকা সত্ত্বেও NULL0 এর পরিবর্তে রিটার্ন মান হিসাবে ব্যবহার করার কারণ কী main()?

অজ্ঞতা। এটি করার কোনও ভাল কারণ নেই ।

  • এটি প্রয়োগ-সংজ্ঞায়িত যদি এটি যথাযথ হয় বা না হয় এবং তবে যদি কোনও বাস্তবায়ন কেন পয়েন্টার মান ফিরে পেতে চাইবে?

না, এটি কখনই উপযুক্ত নয় । সংকলক এটি অনুমতি দেয় কিনা তা বাস্তবায়নের উপর নির্ভর করে। একটি উপযুক্ত সি ++ সংকলক সতর্কতা ছাড়াই এটি ভাল অনুমতি দিতে পারে।


1
আমার স্বাভাবিক থাবা: সংকলক এটির অনুমতি দেয় কিনা তা বাস্তবায়ন-সংজ্ঞায়িত নয়; এটা implemenation-নির্দিষ্ট । স্ট্যান্ডার্ডে, "প্রয়োগ-সংজ্ঞায়িত" এর অর্থ হ'ল বাস্তবায়নটি অবশ্যই এটি ডকুমেন্ট করে।
পিট বেকার 14

@ পেটবেকার এটি লেখার সময় আমি বিরতি দিয়েছিলাম তবে যাইহোক এগিয়ে চলেছি (কারণ "বাস্তবায়ন-নির্দিষ্ট" এবং অনুরূপ বাক্যাংশগুলি কেবল অপ্রাকৃত মনে হয়)। তবে আপনি সঠিক, আমি এটি পরিবর্তন করব।
কনরাড রুডল্ফ

আমার কাছে মনে হয় যে "বাস্তবায়ন-সংজ্ঞায়িত" প্রাকৃতিক শব্দগুলির একমাত্র কারণ হ'ল লোকেরা এটির অপব্যবহার দেখে অভ্যস্ত। <g>
পিট বেকার

8

আমি যখন এই সিসি কোডটি জিসিসি দিয়ে সংকলন করি তখন আমি এর সতর্কতা পাই:

warning: return makes integer from pointer without a cast

আপনি ল্যাক সংকলক বিকল্পগুলির সাথে সংকলন করার কারণ এটি। কঠোর সি স্ট্যান্ডার্ড সেটিংস ব্যবহার করুন এবং নাল পয়েন্টার ধ্রুবকটিতে প্রসারিত -std=c11 -pedantic-errorsহলে বাস্তবায়নে আপনি প্রত্যাশিত সংকলক ত্রুটি NULLপাবেন (void*)0। দেখুন বিষয় "একটি ঢালাই ছাড়া পয়েন্টার থেকে পূর্ণসংখ্যা / পূর্ণসংখ্যা থেকে পয়েন্টার"

বাস্তবায়নের ক্ষেত্রে যেখানে NULLপ্রসারিত হয় 0, কোডটি কঠোরভাবে স্ট্যান্ডার্ড কমপ্লিমেন্ট বলছে তবে খুব খারাপ শৈলী, অ-বহনযোগ্য এবং সর্বোপরি সবচেয়ে খারাপ: সম্পূর্ণ বাজে কথা।

এবং এটি g ++ দিয়ে সংকলন করুন, আমি একটি সমতুল্য সতর্কতা পেয়েছি:

warning: converting to non-pointer type int from NULL [-Wconversion-null]

সি ++ 11 এবং এর বাইরেও NULLব্যবহার করা উচিত নয় - পরিবর্তে ব্যবহার করুন nullptr। প্রধান () থেকে এটিকে ফিরিয়ে দেওয়া ভুল নির্বিশেষে is NULLসর্বদা 0সি ++ তে প্রসারিত হয় তাই কঠোরভাবে বলতে গেলে এটি কাজ করবে তবে এটি খুব খারাপ শৈলী এবং সর্বোপরি সবচেয়ে খারাপ: সম্পূর্ণ বাজে কথা।

এটা কি শুধুই খারাপ কোডিং স্টাইল?

কেবল খারাপ নয়, তবে কোনও যুক্তি ছাড়াই বাজে কোডিং শৈলী। প্রোগ্রামার যিনি এটি লিখেছিলেন তা অযোগ্য।


2

এটা কি শুধুই খারাপ কোডিং স্টাইল?

খারাপ। প্রোগ্রামটি ঠিক হয়ে গেছে তা নির্দেশ করার সঠিক উপায়

#include <stdlib.h>

int main (void)
{
    return EXIT_SUCCESS;
}

1
এটি খাঁটি পেডেন্ট্রি। সি স্ট্যান্ডার্ড অনুসারে, একটি 0 টি আর্গুমেন্ট exit()(বা মূল থেকে 0 টি রিটার্ন মান) এর অর্থ একই EXIT_SUCCESS
মশবী

আর C99 যেহেতু আপনি শুধু বর্জন করতে returnথেকে main। সুতরাং, আপনার প্রোগ্রামটির আরও "সঠিক" সংস্করণটি হ'ল int main(void){};-)
ম্যাসভি

1

কিছু / অনেক / সব? সি ++ বাস্তবায়ন NULLহ'ল একটি ম্যাক্রো প্রসারিত 0

এটি কার্যকর যখন প্রসারিত হয় return 0। যা একটি বৈধ রিটার্ন মান।

এটা কি শুধুই খারাপ কোডিং স্টাইল?

হ্যাঁ.

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