কেন কোনও মান ফিরিয়ে না দিয়ে একটি অ-শূন্য ফাংশনটির সমাপ্তি প্রবাহের সংকলক ত্রুটি তৈরি করে না?


158

আমি বহু বছর আগে বুঝতে পেরেছি যে এটি ডিফল্টরূপে কোনও ত্রুটি তৈরি করে না (কমপক্ষে জিসিসিতে), কেন আমি সর্বদা ভাবছি কেন?

আমি বুঝেছি যে আপনি একটি সতর্কতা তৈরি করতে সংকলক পতাকাগুলি প্রকাশ করতে পারেন, তবে এটি কি সর্বদা ত্রুটি হওয়া উচিত নয়? একটি অ-শূন্য ফাংশনটি বৈধ হওয়ার জন্য কোনও মান ফেরৎ না দেওয়ার জন্য এটি কেন বোঝায়?

মন্তব্যে অনুরোধ হিসাবে একটি উদাহরণ:

#include <stdio.h>
int stringSize()
{
}

int main()
{
    char cstring[5];
    printf( "the last char is: %c\n", cstring[stringSize()-1] ); 
    return 0;
}

... প্রনয়ন।


9
বিকল্পভাবে, আমি সমস্ত সতর্কতাগুলি ত্রুটির মতো তুচ্ছ হিসাবে বিবেচনা করি এবং আমি যে সমস্ত সতর্কতাগুলি করতে পারি তা সক্রিয় করে রাখি (প্রয়োজনে স্থানীয় নিষ্ক্রিয়করণের সাথে ... তবে কেন কোডে তা পরিষ্কার)।
ম্যাথিউ এম।

8
-Werror=return-typeঠিক সেই সতর্কতাটিকে একটি ত্রুটি হিসাবে বিবেচনা করবে। আমি কেবল সতর্কতাটি উপেক্ষা করেছি এবং একটি অবৈধ thisপয়েন্টারটি খুঁজে বের করতে কয়েক মিনিটের হতাশার কারণ আমাকে এখানে এবং এই সিদ্ধান্তে নিয়ে গেছে।
jozxyqk

এটিকে আরও খারাপ করে তুলেছে যে std::optionalফাংশনটির শেষ প্রান্তে প্রবাহিত না হয়ে প্রত্যাবর্তন একটি "সত্য" returnsচ্ছিক প্রত্যাবর্তন করে
রুফাস

@ রুফাস এটি করতে হবে না। আপনার মেশিন / সংকলক / ওএস / চন্দ্র চক্রের ক্ষেত্রে যা ঘটেছে ঠিক তেমনই ঘটেছিল। অপরিজ্ঞাপিত আচরণের কারণে যা কিছু জাঙ্ক কোড সংকলক উত্পন্ন করেছিল তা কেবল একটি 'সত্য' alচ্ছিকর মতো দেখা যায়, যা কিছু হোক না কেন।
আন্ডারস্কোর_আর

উত্তর:


146

সি 99 এবং সি ++ মানগুলির কোনও মান ফেরত দেওয়ার জন্য ফাংশন প্রয়োজন হয় না। মান-ফেরত ফাংশনে অনুপস্থিত রিটার্ন স্টেটমেন্টটি কেবলমাত্র ফাংশনে সংজ্ঞায়িত করা হবে (প্রত্যাবর্তনে 0) main

যুক্তিতে অন্তর্ভুক্ত রয়েছে যে প্রতিটি কোড পাথ কোনও মান দেয় কিনা তা পরীক্ষা করা বেশ কঠিন এবং এম্বেডড এসেম্বেবলার বা অন্যান্য কৌশলগুলির সাথে একটি রিটার্ন মান সেট করা যেতে পারে।

থেকে সি ++ 11 খসড়া:

.6 6.6.3 / 2

কোনও ফাংশন শেষে প্রবাহিত [...] এর ফলে কোনও মান-ফেরত ফাংশনে অপরিজ্ঞাত আচরণ হয়।

§ 3.6.1 / 5

যদি mainকোনও return বিবৃতি মুখোমুখি না হয়ে নিয়ন্ত্রণের শেষে পৌঁছায় তবে প্রভাব কার্যকর হয় uting

return 0;

নোট করুন যে C ++ 6.6.3 / 2 এ বর্ণিত আচরণটি সি তে এক নয় Note


আপনি যদি এটি রাইট-টাইপ বিকল্পের সাথে কল করেন তবে জিসিসি আপনাকে একটি সতর্কতা দেবে।

-Wreturn-টাইপ সতর্কতা করুন যখনই কোনও ফাংশন কোনও রিটার্ন-টাইপের সাথে সংজ্ঞায়িত করা হয় যা পূর্বে ডিফল্ট হয়। এমন কোনও ফাংশনে যার রিটার্ন-টাইপটি বাতিল নয় (ফাংশন বডিটির শেষ প্রান্তটি মান ব্যতীত প্রত্যাবর্তন হিসাবে বিবেচিত হয়) এবং কোনও ফাংশনে যার মত প্রকাশের সাথে একটি রিটার্ন বিবৃতি সম্পর্কে সতর্ক করুন রিটার্ন-টাইপ অকার্যকর

এই সতর্কতা -ওয়াল দ্বারা সক্ষম করা হয়েছে


একটি কৌতূহল হিসাবে, দেখুন এই কোডটি কী করে:

#include <iostream>

int foo() {
   int a = 5;
   int b = a + 1;
}

int main() { std::cout << foo() << std::endl; } // may print 6

এই কোডটি আনুষ্ঠানিকভাবে অপরিবর্তিত আচরণ করেছে, এবং বাস্তবে এটি কনভেনশন এবং আর্কিটেকচার নির্ভর নির্ভর করছে। একটি নির্দিষ্ট সিস্টেমে, একটি নির্দিষ্ট সংকলক সহ, রিটার্ন মান হ'ল eaxসিস্টেমের প্রসেসরের রেজিস্টারে সঞ্চিত সর্বশেষ প্রকাশের মূল্যায়নের ফলাফল ।


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

4
@ ক্যাটসকুল, আপনি কেন এই যুক্তিটি কিনছেন? তুচ্ছভাবে সহজ না হলে কোনও ফাংশনের এক্সটেন পয়েন্ট চিহ্নিত করা এবং তারা সকলেই কোনও মান (এবং ঘোষিত ফেরতের ধরণের মান) ফেরত দেয় তা নিশ্চিত করা কি সম্ভব হবে না?
ব্লুবম্বার

3
@ ক্যাটসকুল, হ্যাঁ এবং না। স্ট্যাটিকালি টাইপ করা এবং / অথবা সংকলিত ভাষাগুলি প্রচুর কাজ করে যা আপনি সম্ভবত "নিষেধাজ্ঞামূলকভাবে ব্যয়বহুল" হিসাবে বিবেচনা করবেন তবে সংকলনের সময় তারা কেবল এটি একবার করে করলে তাদের नगয় ব্যয় হয়। এমনকি এটি বলার পরেও, আমি দেখতে পাচ্ছি না যে কোনও ফাংশনের প্রস্থান পয়েন্টগুলি শনাক্তকরণের জন্য সুপার-লিনিয়ার হওয়া দরকার: আপনি কেবল ফাংশনটির এএসটি পেরিয়ে যান এবং রিটার্ন বা প্রস্থান কলগুলি সন্ধান করেন। এটি লিনিয়ার সময়, যা নির্ধারিতভাবে দক্ষ।
ব্লুবম্বার

3
@ লাইটনেসেসেসিনআরবিত: যদি কোনও রিটার্ন মান সহ কোনও ফাংশন যদি কখনও কখনও কোনও মান সহ তত্ক্ষণাত্ ফিরে আসে এবং কখনও কখনও অন্য কোনও ফাংশনকে কল করে যা সর্বদা throwবা এর মাধ্যমে উপস্থিত হয় longjmp, সংকলককে কি ফিরে না আসা ফাংশনটিতে returnকল অনুসরণ করে একটি অ্যাক্সেসযোগ্য প্রয়োজন ? যে ক্ষেত্রে এটির প্রয়োজন নেই খুব সাধারণ ঘটনা নয় এবং এমনকি এ জাতীয় ক্ষেত্রে এটি অন্তর্ভুক্ত করার প্রয়োজনীয়তা সম্ভবত কঠোর হবে না, তবে এটির প্রয়োজন না হওয়ার সিদ্ধান্তটি যুক্তিসঙ্গত।
সুপারক্যাট

1
@ সুপের্যাট: একটি অতি-বুদ্ধিমান সংকলক এ জাতীয় ক্ষেত্রে সতর্ক বা ত্রুটি হিসাবে সতর্ক করবে না, তবে - আবার - এটি সাধারণ ক্ষেত্রে অপরিহার্যভাবে অগণনীয়, তাই আপনি থাম্বের একটি সাধারণ নিয়মের সাথে আটকে রয়েছেন। আপনি যদি জানেন তবে আপনার ফাংশনটি কখনই পৌঁছতে পারে না, তবে আপনি প্রচলিত ফাংশন পরিচালনা করার শব্দার্থ থেকে এত দূরে রয়েছেন যে, হ্যাঁ, আপনি এগিয়ে যেতে পারেন এবং জানতে পারেন যে এটি নিরাপদ। সত্যই, আপনি যে বিন্দুতে সি ++ এর নীচে একটি স্তর এবং যেমন এর সমস্ত গ্যারান্টি যাইহোক মোটামুটি।
bit

42

জিসিসি ডিফল্টরূপে পরীক্ষা করে না যে সমস্ত কোড পাথ কোনও মান দেয় কারণ সাধারণভাবে এটি করা যায় না। এটি ধরে নিচ্ছে যে আপনি কী করছেন জানেন know গণনা ব্যবহার করে একটি সাধারণ উদাহরণ বিবেচনা করুন:

Color getColor(Suit suit) {
    switch (suit) {
        case HEARTS: case DIAMONDS: return RED;
        case SPADES: case CLUBS:    return BLACK;
    }

    // Error, no return?
}

আপনি প্রোগ্রামার জানেন যে কোনও বাগ বাদে এই পদ্ধতিটি সর্বদা একটি রঙ দেয় returns জিসিসি বিশ্বাস করে যে আপনি কী করছেন তা আপনি জানেন যে এটি আপনাকে ফাংশনের নীচে ফিরে যেতে বাধ্য করবে না।

অন্যদিকে জাভাক যাচাই করে যাচাই করার চেষ্টা করে যে সমস্ত কোড পাথ কোনও মান দেয় এবং যদি ত্রুটি ছুঁড়ে দেয় তবে যদি এটি প্রমাণ করে যে তারা সব করে। এই ত্রুটিটি জাভা ভাষার নির্দিষ্টকরণের দ্বারা বাধ্যতামূলক। মনে রাখবেন যে কখনও কখনও এটি ভুল হয় এবং আপনাকে একটি অপ্রয়োজনীয় রিটার্ন বিবৃতি দিতে হয়।

char getChoice() {
    int ch = read();

    if (ch == -1 || ch == 'q') {
        System.exit(0);
    }
    else {
        return (char) ch;
    }

    // Cannot reach here, but still an error.
}

এটি একটি দার্শনিক পার্থক্য। সি এবং সি ++ জাভা বা সি # এর চেয়ে বেশি অনুমোদিত এবং বিশ্বাসযোগ্য ভাষা এবং তাই নতুন ভাষাগুলিতে কিছু ত্রুটি হ'ল সি / সি ++ এ সতর্কতা এবং কিছু সতর্কতা ডিফল্টরূপে উপেক্ষা করা বা বন্ধ করা হয়।


2
জাভ্যাক যদি আসলে কোড-পাথগুলি পরীক্ষা করে থাকে তবে কি এটি দেখতে পাবে না যে আপনি কখনই এই পর্যায়ে পৌঁছাতে পারবেন না?
ক্রিস লুটজ

3
প্রথমটিতে এটি আপনাকে এনামের সমস্ত কেস কভার করার জন্য ক্রেডিট দেয় না (আপনার কোনও ডিফল্ট কেস বা স্যুইচের পরে ফেরত দরকার) এবং দ্বিতীয়টিতে এটি জানে না যে System.exit()কখনই ফিরে আসে না।
জন কুগেলম্যান

2
জাভাক (অন্যথায় শক্তিশালী সংকলক) System.exit()কখনও কখনও ফিরে আসে না তা জেনে এটা সোজা মনে হয় । আমি এটি দেখেছি ( java.sun.com/j2se/1.4.2/docs/api/java/lang/… ), এবং ডকগুলি কেবল এটিকে "কখনও কখনও ফিরে আসে না" বলে দেয়। আমি ভাবছি এর অর্থ কী ...
পল বিগগার 10

@ পল: এর অর্থ তাদের কাছে কোনও বিদায়দাতা নেই। অন্যান্য সমস্ত ভাষা বলে যে "কখনই স্বাভাবিকভাবে ফিরে আসে না" - যেমন, "সাধারণ রিটার্ন প্রক্রিয়া ব্যবহার করে ফিরে আসে না।"
ম্যাক্স ল্যাবার্ট

1
আমি অবশ্যই এমন একটি সংকলক পছন্দ করবো যা কমপক্ষে সতর্ক হয়েছিল যে যদি এটির প্রথম উদাহরণটির মুখোমুখি হয় তবে যুক্তিটির যথার্থতা ভঙ্গ হবে যদি কেউ এনামে একটি নতুন মান যুক্ত করে। আমি এমন একটি ডিফল্ট মামলা চাই যা উচ্চস্বরে এবং / অথবা ক্র্যাশ হয়ে অভিযোগ করেছে (সম্ভবত কোনও বক্তব্য ব্যবহার করে)।
ইনজেকটিলো

14

আপনার অর্থ, কোনও মান-ফেরত ফাংশনটির শেষ প্রান্তে প্রবাহ (কেননা স্পষ্ট ব্যতীত প্রস্থান করা return) ত্রুটি নয়?

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

দ্বিতীয়ত, স্পষ্টতই ভাষার স্পেসিফিকেশন সংকলক লেখকদের স্পষ্টর উপস্থিতির জন্য সমস্ত সম্ভাব্য নিয়ন্ত্রণ পাথ সনাক্ত এবং যাচাই করতে বাধ্য করতে চায় নি return(যদিও অনেক ক্ষেত্রে এটি করা এতটা কঠিন নয়)। এছাড়াও, কিছু নিয়ন্ত্রণের পথগুলি প্রত্যাবর্তনযোগ্য ফাংশনগুলিতে নিয়ে যেতে পারে - এমন বৈশিষ্ট্য যা সাধারণত সংকলকটির অজানা। এই জাতীয় পথগুলি বিরক্তিকর মিথ্যা ইতিবাচক উত্স হতে পারে।

এছাড়াও খেয়াল করুন যে, সি এবং সি ++ এই ক্ষেত্রে আচরণের তাদের সংজ্ঞাগুলির সাথে পৃথক। সি ++ এ কেবল কোনও মান ফেরত ফাংশনটির সমাপ্তি সর্বদা অপরিজ্ঞাত আচরণ (ফাংশনটির ফলাফল কলিং কোড ব্যবহার করে কিনা তা নির্বিশেষে) is সিতে এটি কেবল তখনই সংজ্ঞায়িত আচরণের কারণ হয়ে দাঁড়ায় যদি কলিং কোডটি প্রত্যাবর্তিত মানটি ব্যবহার করার চেষ্টা করে।


+1 কিন্তু সি ++ returnশেষের বিবরণী বাদ দিতে পারে না main()?
ক্রিস লুটজ

3
@ ক্রিস লুটজ: হ্যাঁ, mainসে ক্ষেত্রে বিশেষ।
এন্টি

5

সি / সি ++ এর অধীনে কোনও ফাংশন থেকে কিছু না ফিরিয়ে নেওয়া দাবি করা বৈধ। অনেকগুলি ব্যবহারের কেস রয়েছে যেমন কল করা exit(-1)বা কোনও ফাংশন যা এটি কল করে বা একটি ব্যতিক্রম ছুঁড়ে।

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

কিছু সতর্কতা নির্গত করতে ডিফল্ট নো-আরগ জিসিসি পরিবর্তন করা বিদ্যমান স্ক্রিপ্টগুলির জন্য সিস্টেম পরিবর্তন করা বা ব্রেকিং পরিবর্তন হতে পারে। ভাল ডিজাইন করা হয়-Wall এবং সতর্কতা সঙ্গে ডিল, বা স্বতন্ত্র সতর্কতা টগল।

সি ++ টুল চেইন ব্যবহার করা শিখতে সি ++ প্রোগ্রামার হওয়া শেখার ক্ষেত্রে বাধা, তবে সি ++ সরঞ্জাম চেইনগুলি সাধারণত বিশেষজ্ঞরা এবং লেখেন।


হ্যাঁ, আমার মধ্যে Makefileএটি নিয়ে চলছে -Wall -Wpedantic -Werror, তবে এটি ছিল এক-অফ পরীক্ষা স্ক্রিপ্ট যা আমি যুক্তিগুলি সরবরাহ করতে ভুলে গিয়েছিলাম।
মনিকা এর মামলা মোকদ্দমা করুন

2
উদাহরণস্বরূপ, ভাঙ্গা জিসিসি বুটস্ট্র্যাপের -Wduplicated-condঅংশ তৈরি করা -Wallবেশিরভাগ কোডে উপযুক্ত বলে মনে হচ্ছে এমন কিছু সতর্কতা সমস্ত কোডে উপযুক্ত নয়। সে কারণেই তারা ডিফল্টরূপে সক্ষম হয় নি।
ওহ কারও কারও পক্ষে পুতুলের প্রয়োজন

আপনার প্রথম বাক্যটি গ্রহণযোগ্য উত্তরের "প্রবাহিত হওয়া .... অপরিবর্তিত আচরণ ..." -এর উদ্ধৃতিটির সাথে বৈপরীত্য বলে মনে হচ্ছে। নাকি ইউবকে "আইনী" বিবেচনা করা হয়? অথবা আপনি কি বোঝাতে চেয়েছেন যে যদি না (না) ফেরত মানটি ব্যবহার না করা হয় তবে এটি ইউবি নয়? আমি সি ++ কেস
বিটিডব্লিউ

@ tobi303 int foo() { exit(-1); }এমন intকোনও ফাংশন থেকে ফিরে আসে না যা "ইনট রিটার্নের দাবি করে"। এটি সি ++ এ আইনী। এখন, এটি কিছুই ফেরায় না ; যে ফাংশন শেষ কখনও পৌঁছে না। আসলে শেষ অবধি পৌঁছনোfoo হবে অপরিজ্ঞাত আচরণ। প্রক্রিয়া ক্ষেত্রে শেষ অবহেলা, int foo() { throw 3.14; }ফিরে আসারও দাবি করে intকিন্তু কখনই হয় না।
ইয়াক্ক - অ্যাডাম নেভ্রামামন্ট

1
সুতরাং আমার ধারণা void* foo(void* arg) { pthread_exit(NULL); }একই কারণেই ঠিক আছে (যখন এর একমাত্র ব্যবহারের মাধ্যমে pthread_create(...,...,foo,...);)
idclev 463035818

1

আমি বিশ্বাস করি এটি লিগ্যাসি কোডের কারণে হয় (সি এর আগে কখনও রিটার্নের স্টেটমেন্টের প্রয়োজন হয় না) যেমন সি ++ হয়েছিল। সম্ভবত "বৈশিষ্ট্য" উপর নির্ভর করে বিশাল কোড বেস রয়েছে। তবে কমপক্ষে -Werror=return-type অনেকগুলি সংকলক (জিসিসি এবং বিড়াল সহ) পতাকা রয়েছে।


1

কিছু সীমাবদ্ধ এবং বিরল ক্ষেত্রে, কোনও মান ফিরিয়ে না দিয়ে অ-শূন্য ফাংশনের শেষ প্রবাহে কার্যকর হতে পারে be নিম্নলিখিত এমএসভিসি-নির্দিষ্ট কোডের মতো:

double pi()
{
    __asm fldpi
}

এই ফাংশনটি x86 সমাবেশ ব্যবহার করে পাই ফেরৎ দেয়। জিসিসিতে সমাবেশের বিপরীতে, আমি ব্যবহার করার কোনও উপায় জানি নাreturn ফলশ্রুতিতে ওভারহেড জড়িত না করে এটি করার করতে পারি না।

আমি যতদূর জানি, মূলধারার সি ++ সংকলকগুলিকে আপাতত অবৈধ কোডের জন্য কমপক্ষে সতর্কতা নির্গত করা উচিত। আমি যদি শরীর তৈরি করিpi() খালি জিসিসি / কলং একটি সতর্কতার প্রতিবেদন করবে এবং এমএসভিসি ত্রুটির প্রতিবেদন করবে।

লোকেরা ব্যতিক্রম এবং exitকিছু উত্তরে উল্লেখ করেছে । সেগুলি বৈধ কারণ নয়। হয় একটি ব্যতিক্রম নিক্ষেপ, বা কলিং exit, ফাংশন সম্পাদন শেষ প্রবাহ করতে হবে না । এবং সংকলকগণ এটি জানেন: একটি থ্রো স্টেটমেন্ট লিখে বা exitখালি শরীরে কল করা pi()সংকলক থেকে কোনও সতর্কতা বা ত্রুটি বন্ধ করবে।


এমএসভিসি বিশেষত voidইন-লাইন Asm রিটার্ন-ভ্যালু রেজিষ্টারে একটি মান রেখে যাওয়ার পরে একটি অ- কার্যকারিতা শেষে পড়ে যাওয়া সমর্থন করে । (এক্ষেত্রে x87 st0, পূর্ণসংখ্যার জন্য EAX And এই আচরণটি নির্ধারণ করা এমএসভিসির সাথে নির্দিষ্ট; এমনকি -fasm-blocksএকই বাক্য গঠন সমর্থন করার জন্য ঝাঁকুনি না এটিকে নিরাপদ করে তোলে। দেখুন __asm ​​{}; Eax এর মান ফিরিয়ে দাও?
পিটার কর্ডেস

0

কোন পরিস্থিতিতে এটি ত্রুটি তৈরি করে না? এটি যদি কোনও রিটার্নের প্রকার ঘোষণা করে এবং কিছু ফেরত না দেয় তবে এটি আমার কাছে ত্রুটি বলে মনে হচ্ছে।

আমি যে ব্যতিক্রমটি ভাবতে পারি তা হ'ল main()ফাংশনটি, যা মোটেই কোনও returnবিবৃতি প্রয়োজন হয় না (কমপক্ষে সি ++ এ; আমার কাছে সি মানের কোনওটিই কার্যকর নেই)। যদি কোনও রিটার্ন না return 0;পাওয়া যায় তবে এটি শেষ বিবৃতি হিসাবে কাজ করবে ।


1
main()returnসি তে একটি দরকার
ক্রিস লুটজ

@ জেফ্রোমি: ওপি কোনও return <value>;বিবৃতি ছাড়াই একটি অকার্যকর ফাংশন সম্পর্কে জিজ্ঞাসা করছে
বিল

2
মূল স্বয়ংক্রিয়ভাবে 0 এবং সি ++ এ ফিরে আসে। সি 89 এর সুস্পষ্ট রিটার্ন দরকার।
জোহানেস স্কাউব -

1
@ ক্রিস: সি 99 return 0;main()(এবং main()কেবল) এর শেষে একটি অন্তর্ভুক্ত রয়েছে । তবে return 0;যাইহোক এটি যুক্ত করা ভাল স্টাইল ।
পিএমজি

0

মনে হচ্ছে আপনার সংকলক সতর্কতাগুলি আপ করা দরকার:

$ gcc -Wall -Wextra -Werror -x c -
int main(void) { return; }
cc1: warnings being treated as errors
<stdin>: In function main’:
<stdin>:1: warning: return with no value, in function returning non-void
<stdin>:1: warning: control reaches end of non-void function
$

5
"চালু করুন-ওয়ারার" বলা একটি উত্তরহীন। স্পষ্টতই সতর্কতা এবং ত্রুটি হিসাবে শ্রেণীবদ্ধ বিষয়গুলির মধ্যে তীব্রতার মধ্যে পার্থক্য রয়েছে এবং জিসিসি একে একে কম গুরুতর শ্রেণীর হিসাবে বিবেচনা করে।
ক্যাসকেবেল

2
@ জেফ্রমি: শুদ্ধ ভাষার দৃষ্টিকোণ থেকে, সতর্কতা এবং ত্রুটির মধ্যে কোনও পার্থক্য নেই। সংকলকটি কেবল "ডায়াগনস্টিক বার্তা" ইস্যু করার জন্য প্রয়োজনীয়। সংকলন বন্ধ করার বা কোনও "ইয়ার" এবং অন্য কিছুকে "একটি সতর্কতা" বলার দরকার নেই। একটি ডায়াগনস্টিক বার্তা জারি করা হয় (বা যে কোনও ধরণের), সিদ্ধান্ত নেওয়ার বিষয়টি সম্পূর্ণ আপনার উপর নির্ভর করে।
এন্টি

1
তারপরে আবার, প্রশ্নে প্রশ্নটি ইউবির কারণ হয়ে দাঁড়ায়। সংকলকরা মোটেও ইউবি ধরার প্রয়োজন হয় না।
এন্টি

1
12.৯.১ / 12 এ এন 1256-এ এটি বলেছে "যদি function যে কোনও ফাংশন বন্ধ করে দেয় এবং কলকারীর মাধ্যমে ফাংশন কলটির মান ব্যবহৃত হয়, আচরণটি অপরিজ্ঞাত।"
জোহানেস স্কাউব -

2
@ ক্রিস লুটজ: আমি এটি দেখছি না। অ- শূন্য ফাংশনে স্পষ্টভাবে খালি ব্যবহার করা সীমাবদ্ধতা লঙ্ঘন এবং শূন্য return;ফাংশনে এটি ব্যবহার করা সীমাবদ্ধতা লঙ্ঘন return <value>;। তবে এটি, আমি বিশ্বাস করি, বিষয়টি নয়। ওপি, যেমনটি আমি বুঝতে পেরেছি, এটি একটি বিনা শূন্য ফাংশন থেকে বেরিয়ে আসার কথা return(কেবলমাত্র ফাংশনের শেষের দিকে নিয়ন্ত্রণ প্রবাহের অনুমতি দেয়)। এটি কোনও বাধা লঙ্ঘন নয়, আফাইক AI মানকটি কেবল বলে যে এটি সর্বদা সি ++ তে এবং কখনও কখনও সি
তে

-2

এটি c99 এ সীমাবদ্ধতা লঙ্ঘন, তবে সি 98 তে নয়। কনট্রাস্ট:

c89:

3.6.6.4 দি return বিবৃতি

সীমাবদ্ধতাসমূহ

একটি returnএকটি অভিব্যক্তি সঙ্গে বিবৃতি একটি ফাংশন যার রিটার্ন টাইপ হয় প্রদর্শিত হবে না void

C99:

6.8.6.4 দ return বিবৃতি

সীমাবদ্ধতাসমূহ

একটি returnএকটি অভিব্যক্তি সঙ্গে বিবৃতি একটি ফাংশন যার রিটার্ন টাইপ হয় প্রদর্শিত হবে না void। একটি returnএকটি অভিব্যক্তি ছাড়া বিবৃতি শুধুমাত্র একটি ফাংশন যার রিটার্ন টাইপ হয় প্রদর্শিত হইবে void

এমনকি --std=c99মোডে, জিসিসি কেবল একটি সতর্কতা ফেলে দেবে (যদিও অতিরিক্ত সক্ষম করার প্রয়োজন ছাড়াই-W পতাকাগুলি , ডিফল্টরূপে বা সি 89/90-তে প্রয়োজনীয়)।

সি 98 এ যোগ করার জন্য সম্পাদনা করুন, " }কোনও ফাংশন সমাপ্ত করে এটি পৌঁছানো returnকোনও অভিব্যক্তি ছাড়াই একটি বিবৃতি কার্যকর করার সমতুল্য " (3.6.6.4) .4 যাইহোক, c99 এ আচরণটি অপরিজ্ঞাত (6.9.1)।


4
দ্রষ্টব্য যে এটি কেবল সুস্পষ্ট returnবক্তব্যগুলি কভার করে । এটি কোনও মান ফিরিয়ে না দিয়ে কোনও ফাংশনের শেষের দিকে কমে যায় না।
জন কুগেলম্যান

3
নোট করুন যে C99 "ফাংশনটি সমাপ্ত করে an" পৌঁছানো মিস করে "কোনও অভিব্যক্তি ছাড়াই একটি রিটার্ন স্টেটমেন্ট কার্যকর করার সমতুল্য" সুতরাং এটি কোনও সীমাবদ্ধতা লঙ্ঘন করা হয়নি এবং সুতরাং কোনও ডায়াগনস্টিকের প্রয়োজন হয় না।
জোহানেস স্কাউব -
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.