ফাংশন ঘোষণা কোনও প্রোটোটাইপ নয়


158

আমার তৈরি একটি গ্রন্থাগার রয়েছে,

mylib.c:

#include <mylib.h>
int
testlib() {
    printf("Hello world\n");
    return (0);
}

mylib.h:

#include <stdio.h>
extern int testlib();

আমার প্রোগ্রামে, আমি এই লাইব্রেরির ফাংশনটি কল করার চেষ্টা করেছি:

myprogram.c:

#include <mylib.h>

int
main (int argc, char *argv[]) {
    testlib();
    return (0);
}

আমি যখন এই প্রোগ্রামটি সংকলনের চেষ্টা করি তখন আমি নিম্নলিখিত ত্রুটিটি পাই:

ফাইলটিতে মাইপোগ্রাম সিআর: 1 থেকে অন্তর্ভুক্ত রয়েছে
mylib.h: 2 সতর্কতা: ফাংশন ঘোষণা কোনও প্রোটোটাইপ নয়

আমি ব্যাবহার করছি: gcc (GCC) 3.4.5 20051201 (Red Hat 3.4.5-2)

আমার প্রশ্ন হ'ল কোনও ফাংশন প্রোটোটাইপ ঘোষণার সঠিক উপায় কী?


1
Mylib.h এ ঘোষণা থেকে বাহ্যিক সরান Especially বিশেষত আপনি যদি খাঁটি সি প্রোগ্রাম লিখছেন তবে বাহ্যিক ঘোষণাটি সেখানে অপ্রয়োজনীয়।
রায়ান অহারন

উত্তর:


333

সি int foo()এবং int foo(void)বিভিন্ন ফাংশন হয়। 0 টি আর্গুমেন্ট গ্রহণ করে int foo(), যখন একটি স্বতন্ত্র সংখ্যা যুক্তি int foo(void)গ্রহণ করে। সি ++ এ তারা একই জিনিস বোঝায়। আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি voidযখন কোনও যুক্তি বোঝাতে চাইছেন তখন ধারাবাহিকভাবে ব্যবহার করুন ।

আপনি যদি একটি পরিবর্তনশীল থাকে a, extern int a;একটি উপায় কম্পাইলার তা আমাদের জানান হয় aএকটি প্রতীক যে একটি ভিন্ন অনুবাদ ইউনিট (সি কম্পাইলার সোর্স ফাইল জন্য কথা বলতে) উপস্থিত থাকতে পারে, লিঙ্ক সময় পর্যন্ত তা সমাধান হবে না। অন্যদিকে, চিহ্নগুলি যা ফাংশন নামগুলি যেকোনোভাবে লিংক সময়ে সমাধান করা হয়। কোনও ফাংশন ( extern, static) এ স্টোরেজ শ্রেণীর নির্দিষ্টকরণকারীর অর্থ কেবল তার দৃশ্যমানতাকে প্রভাবিত করে এবং externএটি ডিফল্ট, সুতরাং externআসলে অপ্রয়োজনীয়।

আমি externএটি সরানোর পরামর্শ দিচ্ছি , এটি বহিরাগত এবং সাধারণত বাদ দেওয়া হয়।


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

49

দ্রুত উত্তর: পরিবর্তন int testlib()করতে int testlib(void)নির্দিষ্ট করতে যে ফাংশন কোন যুক্তি লাগে।

একটি প্রোটোটাইপ সংজ্ঞা দ্বারা একটি ফাংশন ঘোষণা যা ফাংশনের আর্গুমেন্ট (গুলি) এর ধরণ (গুলি) নির্দিষ্ট করে।

একটি অ-প্রোটোটাইপ ফাংশন ঘোষণার মতো

int foo();

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

এক বা একাধিক আর্গুমেন্ট গ্রহণ করে এমন কোনও ক্রিয়াকলাপের জন্য, আপনি ঘোষণায় প্রতিটি যুক্তির ধরণ নির্দিষ্ট করতে পারেন:

int bar(int x, double y);

কোনও যুক্তি ছাড়াই কাজগুলি একটি বিশেষ কেস। যৌক্তিকরূপে, খালি বন্ধনীগুলি যুক্তিটি নির্দিষ্ট করার একটি ভাল উপায় হতে পারে তবে পুরানো-শৈলীর ফাংশন ঘোষণার জন্য সিনট্যাক্সটি ইতিমধ্যে ব্যবহৃত ছিল, তাই এএনএসআই সি কমিটি মূল voidশব্দটি ব্যবহার করে একটি নতুন সিনট্যাক্স আবিষ্কার করেছিল :

int foo(void); /* foo takes no arguments */

একটি ফাংশন সংজ্ঞা (যা ফাংশনটি আসলে কী করে তার কোড সহ) একটি ঘোষণাও সরবরাহ করে । আপনার ক্ষেত্রে, আপনার অনুরূপ কিছু রয়েছে:

int testlib()
{
    /* code that implements testlib */
}

এটি এর জন্য একটি অ-প্রোটোটাইপ ঘোষণা সরবরাহ করে testlib। একটি সংজ্ঞা হিসাবে, এটি সংকলকটিকে বলে যেটির testlibকোনও পরামিতি নেই, তবে একটি ঘোষণাপত্র হিসাবে, এটি কেবলমাত্র সংকলককে বলে যা testlibকিছু অনির্দিষ্ট কিন্তু নির্দিষ্ট নম্বর এবং যুক্তিগুলির ধরণ (গুলি) নেয়।

আপনি ঘোষণায় পরিবর্তন ()হলে (void)একটি প্রোটোটাইপ হয়ে যায়।

প্রোটোটাইপের সুবিধা হ'ল আপনি যদি দুর্ঘটনাক্রমে testlibএক বা একাধিক যুক্তি দিয়ে কল করেন তবে সংকলক ত্রুটিটি সনাক্ত করে।

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


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