সি তে একটি "স্ট্যাটিক" ফাংশন কী?


505

প্রশ্ন ছিল সরল সম্পর্কে ফাংশন, না static পদ্ধতি, মতামত হিসাবে স্পষ্ট।

আমি বুঝতে পারি একটি staticপরিবর্তনশীল কী, তবে একটি staticফাংশন কী?

এবং কেন এটি হ'ল যদি আমি কোনও ফাংশন ঘোষণা করি, আসুন বলি void print_matrix, a.c(ব্যতীত a.h) বলি এবং অন্তর্ভুক্ত করি "a.c"- আমি পাই "print_matrix@@....) already defined in a.obj", তবে আমি যদি এটি ঘোষণা করি static void print_matrixতবে এটি সংকলিত হয়?

হালনাগাদ কেবল জিনিসগুলি সাফ করার জন্য - আমি জানি যে অন্তর্ভুক্ত .cকরাও খারাপ, কারণ আপনারা অনেকে উল্লেখ করেছেন। এই main.cসমস্ত ফাংশনকে কীভাবে সঠিকভাবে .hএবং .cফাইলগুলিতে গ্রুপ করা যায় তার সম্পর্কে আমার আরও ভাল ধারণা না পাওয়া পর্যন্ত আমি কেবল অস্থায়ীভাবে স্থান পরিষ্কার করার জন্য এটি করি । কেবল একটি অস্থায়ী, দ্রুত সমাধান

উত্তর:


684

staticফাংশনগুলি এমন ফাংশন যা কেবল একই ফাইলে অন্য ফাংশনগুলিতে দৃশ্যমান হয় (আরও স্পষ্টভাবে একই অনুবাদ ইউনিট )।

সম্পাদনা : যাঁরা ভেবেছিলেন, প্রশ্নগুলির লেখককে বোঝানো হচ্ছে একটি 'শ্রেণি পদ্ধতি': প্রশ্নটি ট্যাগ হওয়ার সাথে সাথে Cতার অর্থ একটি সরল পুরানো সি ফাংশন। (সি ++ / জাভা / ...) শ্রেণি পদ্ধতির জন্য, staticমানে এই পদ্ধতিটি শ্রেণিতেই কল করা যায়, সেই শ্রেণীর কোনও উদাহরণ প্রয়োজন নেই।


2
আসলে আমি এটি সি ++ ট্যাগ করিনি, কিছু অ্যাডমিন সম্ভবত সম্ভবত করেছিলেন, তবে এটি সি ++ সম্পর্কে ছিল, তাই সি ++ এর মধ্যে পার্থক্য কী?
স্লাভা ভি

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

2
না, সে এখনও একটি সি ++ ফাংশন বোঝায়। সি ++ সদস্য ফাংশনের পরিবর্তে একটি সি ++ ফ্রি ফাংশন।
অরবিটে মার্চীনতা রেস

3
@ চক: সি ++ পরিভাষা কখনই "পদ্ধতি" শব্দটি ব্যবহার করে না; এটি জাভা পরিভাষা - সি ++ স্ট্যান্ডার্ড ডকুমেন্টগুলিতে এটিকে সর্বদা "সদস্য ফাংশন" বলা হয় ( এই উত্তরটি দেখুন বা জাভা শর্তাদি সি ++ এর এই শব্দকোষটি দেখুন (যেমন সি ++ "ডেটা সদস্য" ব্যবহার করে এবং জাভা "ক্ষেত্র" ইত্যাদি ব্যবহার করে))।
শ্রীভাতসার আর

6
এই উত্তরটি কিছুটা স্পষ্ট করার জন্য: এই নামের প্রথম ঘোষণার নীচে ফাংশনের নামটি একই অনুবাদ ইউনিটের অন্যান্য অংশে কেবল দৃশ্যমান। ফাংশনটি অন্যান্য ইউনিট (এবং একই ইউনিটের পূর্ববর্তী অংশ) থেকে অন্য উপায়ে কল করা যেতে পারে, যেমন একটি ফাংশন পয়েন্টার।
এমএম

199

সিতে স্ট্যাটিক ফাংশন এবং সি ++ এ স্ট্যাটিক সদস্য ফাংশনগুলির মধ্যে একটি বড় পার্থক্য রয়েছে। সি-তে, কোনও স্ট্যাটিক ফাংশন তার অনুবাদ ইউনিটের বাইরে দৃশ্যমান হয় না, যা এটি সঙ্কলিত বস্তুর ফাইল। অন্য কথায়, একটি ফাংশন স্থিতিশীল করা তার সুযোগকে সীমাবদ্ধ করে। আপনি একটি স্ট্যাটিক ফাংশনটিকে তার * .সি ফাইলের "ব্যক্তিগত" হিসাবে ভাবতে পারেন (যদিও এটি কঠোরভাবে সঠিক নয়)।

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

অ স্থিতিশীল সদস্য ফাংশনগুলি ক্লাসের সমস্ত ডেটা সদস্য অ্যাক্সেস করতে পারে: স্থির এবং অ-স্থিতিশীল। স্ট্যাটিক সদস্য ফাংশন কেবল স্থিতিশীল ডেটা সদস্যদের উপরই পরিচালনা করতে পারে।

এটি সম্পর্কে চিন্তা করার এক উপায় হ'ল সি ++ এ স্থিতিশীল ডেটা সদস্য এবং স্থির সদস্যের ক্রিয়াকলাপগুলি কোনও বস্তুর সাথে সম্পর্কিত নয়, তবে পুরো শ্রেণীর কাছে।


42
সি ++ এর ফাইল-স্ট্যাটিকও রয়েছে। এর মধ্যে সি আনার দরকার নেই।
অরবিটে মার্চীনতা রেস

17
সি ++ এ, একটি স্ট্যাটিক ফাংশন একটি স্ট্যাটিক ফাংশন। একটি স্ট্যাটিক সদস্য ফাংশন একটি স্ট্যাটিক সদস্য ফাংশন, এটি একটি পদ্ধতি হিসাবেও পরিচিত। সি এর সদস্য না থাকার অর্থ এই নয় যে ফাংশনগুলি "সি" হয়।
গেরাসিমোস আর

3
গ্লোবাল ভেরিও এবং ক্লাস স্ট্যাটিক ভার (নেমস্পেস বাদে) এর মধ্যে কি কোনও পার্থক্য রয়েছে?
আলেকজান্ডার মালাখভ

3
নাম স্থানটি প্রধান পার্থক্য। অন্য পার্থক্যটি হ'ল আপনি একটি স্ট্যাটিক ডেটা সদস্যকে ব্যক্তিগত করতে পারেন এবং এইভাবে শ্রেণীর সদস্য ফাংশন থেকে কেবল অ্যাক্সেসযোগ্য। অন্য কথায়, আপনার কাছে একটি বৈশ্বিক ভেরিয়েবলের তুলনায় স্থিতিশীল ডেটা সদস্যের উপর অনেক বেশি নিয়ন্ত্রণ রয়েছে।
দিমা

2
কেউ যদি ব্যাখ্যা করতে পারে যে কোনও স্ট্যাটিক ফাংশনটিকে তার .c ফাইলের ব্যক্তিগত হিসাবে কেন ভাবা হয় তবে তা কেন কঠোরভাবে সঠিক নয়? কি বলার বাকি?
YoTengoUnLCD

77

সি ++ এ ফাংশনগুলির ক্ষেত্রে কীওয়ার্ড স্ট্যাটিকের জন্য দুটি ব্যবহার রয়েছে।

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

// inside some .cpp file:

static void foo();    // old "C" way of having internal linkage

// C++ way:
namespace
{
   void this_function_has_internal_linkage()
   {
      // ...
   }
}

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


1
প্রশ্নটি সিটিতে স্থির সম্পর্কে।
Deqing

8
@ প্রশ্নের সমাধানটি মূলত সি ++ তে ট্যাগ করা হয়েছিল এবং লেখক ".cpp" ফাইলগুলি ব্যবহার করার বিষয়ে কথা বলেন।
ব্রায়ান নিল

57

ন্যূনতম চলমান মাল্টি-ফাইল স্কোপের উদাহরণ

এখানে আমি ব্যাখ্যা করেছি যে কীভাবে staticএকাধিক ফাইল জুড়ে ফাংশন সংজ্ঞাগুলির সুযোগকে প্রভাবিত করে।

এসি

#include <stdio.h>

/* Undefined behavior: already defined in main.
 * Binutils 2.24 gives an error and refuses to link.
 * /programming/27667277/why-does-borland-compile-with-multiple-definitions-of-same-object-in-different-c
 */
/*void f() { puts("a f"); }*/

/* OK: only declared, not defined. Will use the one in main. */
void f(void);

/* OK: only visible to this file. */
static void sf() { puts("a sf"); }

void a() {
    f();
    sf();
}

main.c

#include <stdio.h>

void a(void);        

void f() { puts("main f"); }

static void sf() { puts("main sf"); }

void m() {
    f();
    sf();
}

int main() {
    m();
    a();
    return 0;
}

গিটহাব উজানের দিকে

সংকলন এবং চালান:

gcc -c a.c -o a.o
gcc -c main.c -o main.o
gcc -o main main.o a.o
./main

আউটপুট:

main f
main sf
main f
a sf

ব্যাখ্যা

  • দুটি পৃথক ফাংশন রয়েছে sf, প্রতিটি ফাইলের জন্য একটি
  • একটি একক ভাগ করা ফাংশন আছে f

যথারীতি স্কোপটি যত ছোট হবে তত ভাল, staticযদি আপনি পারেন তবে সর্বদা ফাংশনগুলি ঘোষণা করুন ।

সি প্রোগ্রামিংয়ে ফাইলগুলি প্রায়শই "শ্রেণি" উপস্থাপন করতে ব্যবহৃত হয় এবং staticফাংশনগুলি শ্রেণীর "ব্যক্তিগত" পদ্ধতিগুলি উপস্থাপন করে।

একটি সাধারণ সি প্যাটার্ন হ'ল thisপ্রথম "পদ্ধতি" আর্গুমেন্ট হিসাবে একটি কাঠামো পাস করা , যা মূলত হুডের নীচে সি ++ যা করে।

স্ট্যান্ডার্ড এটি সম্পর্কে কি বলে

C99 N1256 খসড়া 6.7.1 "স্টোরেজ-শ্রেণীর নির্দিষ্টকরণকারী" বলছে এটি staticএকটি "স্টোরেজ-শ্রেণীর নির্দিষ্টকরণকারী"।

6.2.2 / 3 "সনাক্তকারীদের লিঙ্কেজ" বলতে staticবোঝায় internal linkage:

যদি কোনও বস্তুর বা কোনও ফাংশনের জন্য কোনও ফাইল স্কোপ শনাক্তকারীর ঘোষণায় স্টোরেজ-শ্রেণীর নির্দিষ্টকরণকারক স্থিতিশীল থাকে, সনাক্তকারীটির অভ্যন্তরীণ সংযোগ থাকে।

এবং 6.2.2 / 2 বলেছেন যে internal linkageআমাদের উদাহরণের মতো আচরণ করে:

অনুবাদ ইউনিট এবং গ্রন্থাগারগুলির সেটগুলিতে যা একটি সম্পূর্ণ প্রোগ্রাম গঠন করে, বাহ্যিক লিঙ্কেজ সহ একটি নির্দিষ্ট সনাক্তকারীর প্রতিটি ঘোষণা একই বস্তু বা ফাংশনকে বোঝায়। একটি অনুবাদ ইউনিটের মধ্যে, অভ্যন্তরীণ লিঙ্কেজ সহ সনাক্তকারীগুলির প্রতিটি ঘোষণা একই বস্তু বা ফাংশনটিকে বোঝায়।

যেখানে "অনুবাদ ইউনিট" প্রাকপ্রসেসিংয়ের পরে উত্স ফাইল।

কীভাবে জিসিসি এটি ইএলএফ (লিনাক্স) এর জন্য প্রয়োগ করে?

সঙ্গে STB_LOCALবাঁধাই।

যদি আমরা সংকলন করি:

int f() { return 0; }
static int sf() { return 0; }

এবং এর সাথে প্রতীক টেবিলটি বিচ্ছিন্ন করুন:

readelf -s main.o

আউটপুট রয়েছে:

Num:    Value          Size Type    Bind   Vis      Ndx Name
  5: 000000000000000b    11 FUNC    LOCAL  DEFAULT    1 sf
  9: 0000000000000000    11 FUNC    GLOBAL DEFAULT    1 f

সুতরাং বাঁধাই তাদের মধ্যে একমাত্র উল্লেখযোগ্য পার্থক্য। Valueএটি কেবল .bssবিভাগে তাদের অফসেট , সুতরাং আমরা এটির ভিন্নতা প্রত্যাশা করি।

STB_LOCALhttp://www.sco.com/developers/gabi/2003-12-17/ch4.symtab.html এ ইএলএফ স্পেশায় নথিভুক্ত করা হয়েছে :

STB_LOCAL স্থানীয় চিহ্নগুলি তাদের সংজ্ঞা সম্বলিত অবজেক্ট ফাইলের বাইরে দৃশ্যমান নয়। একে অপরের সাথে হস্তক্ষেপ না করে একই নামের স্থানীয় চিহ্নগুলি একাধিক ফাইলে থাকতে পারে

যা প্রতিনিধিত্ব করার জন্য এটি একটি নিখুঁত পছন্দ করে তোলে static

স্ট্যাটিক ব্যতীত ফাংশনগুলি হ'ল STB_GLOBAL, এবং চশমাটি বলে:

লিঙ্ক এডিটরটি যখন বেশ কয়েকটি স্থান পরিবর্তনযোগ্য অবজেক্ট ফাইল সংযুক্ত করে, তখন এটি একই নামের সাথে STB_GLOBAL প্রতীকগুলির একাধিক সংজ্ঞা দেয় না।

যা একাধিক অ স্থিত সংজ্ঞাতে লিঙ্ক ত্রুটির সাথে সুসংগত।

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

আরো দেখুন

সি ++ বেনামে নামস্থান

সি ++ তে আপনি স্ট্যাটিকের পরিবর্তে বেনামে নেমস্পেস ব্যবহার করতে চাইতে পারেন যা একইরকম প্রভাব অর্জন করে তবে প্রকারের সংজ্ঞাগুলি গোপন করে: অজ্ঞাত / বেনাম নেমস্পেস বনাম স্থির ফাংশন


3
দ্রষ্টব্য: void f() { puts("sf"); }(যেমন দুটি সংজ্ঞা f()) কোনও ডায়াগনস্টিকের প্রয়োজন ছাড়াই অপরিজ্ঞাত আচরণের কারণ। আসলে একটি ত্রুটি বার্তা দেখতে এটি একটি মানের-লিঙ্কার সমস্যা।
এমএম

2
এটি সেরা এবং সুনির্দিষ্ট ব্যাখ্যা! আপনার চেয়ে!
অ্যাকোয়া

20

নীচের প্লেইন সি ফাংশন সম্পর্কে - একটি সি ++ শ্রেণিতে সংশোধক 'স্ট্যাটিক' এর আরেকটি অর্থ রয়েছে।

আপনার যদি কেবল একটি ফাইল থাকে তবে এই সংশোধকটি একেবারেই কোনও পার্থক্য করে না। পার্থক্যটি একাধিক ফাইল সহ বড় প্রকল্পগুলিতে আসে:

সি-তে, প্রতিটি "মডিউল" (স্যাম্পল.ক এবং স্যাম্পল। H এর সংমিশ্রণ) স্বাধীনভাবে সংকলিত হয় এবং তারপরে সেই সংকলিত অবজেক্ট ফাইলগুলির প্রত্যেকটি (নমুনা.ও) লিঙ্কার দ্বারা একটি এক্সিকিউটেবল ফাইলের সাথে সংযুক্ত থাকে।

ধরা যাক আপনার বেশ কয়েকটি ফাইল রয়েছে যা আপনি আপনার মূল ফাইলটিতে অন্তর্ভুক্ত করেছেন এবং এর মধ্যে দুটি ফাংশন রয়েছে যা কেবল অভ্যন্তরীণভাবে কেবল সুবিধার জন্য ব্যবহৃত হয় add(int a, b)- সংকলক সহজেই এই দুটি মডিউলের জন্য অবজেক্ট ফাইল তৈরি করতে পারে তবে লিঙ্কার একটি ত্রুটি ছুঁড়ে দেবে, কারণ এটি একই নামের সাথে দুটি ফাংশন সন্ধান করে এবং এটি কোনটি ব্যবহার করবে তা জানে না (লিঙ্ক করার মতো কিছু না থাকলেও, কারণ সেগুলি অন্য কোথাও ব্যবহৃত হয় না তবে এটি নিজস্ব ফাইলটিতে রয়েছে)।

এজন্য আপনি এই ফাংশনটি তৈরি করেন যা কেবল অভ্যন্তরীণ ব্যবহৃত হয়, একটি স্থির ফাংশন। এই ক্ষেত্রে সংকলক সাধারণত "আপনি এই জিনিসটিকে লিঙ্ক করতে পারবেন" - লিঙ্কারের জন্য ফ্ল্যাশ তৈরি করে না, যাতে লিঙ্কারটি এই ফাংশনটি দেখতে না পায় এবং একটি ত্রুটি তৈরি না করে।


16

প্রথম: সাধারণত .cppঅন্য ফাইলটিতে একটি ফাইল অন্তর্ভুক্ত করা একটি খারাপ ধারণা - এটি এর মতো সমস্যার দিকে পরিচালিত করে :-) সাধারণ উপায় হ'ল পৃথক সংকলন ইউনিট তৈরি করা এবং অন্তর্ভুক্ত ফাইলটির জন্য একটি শিরোনাম ফাইল যুক্ত করা।

দ্বিতীয়ত:

সি ++ এর এখানে কিছু বিভ্রান্তিকর পরিভাষা রয়েছে - মন্তব্যে উল্লেখ না করা পর্যন্ত আমি এটি সম্পর্কে জানতাম না।

ক) static functions- সি থেকে উত্তরাধিকার সূত্রে প্রাপ্ত, এবং আপনি এখানে কী বলছেন। যে কোনও ক্লাসের বাইরে। একটি স্ট্যাটিক ফাংশনটির অর্থ এটি বর্তমান সংকলন ইউনিটের বাইরে দৃশ্যমান নয় - সুতরাং আপনার ক্ষেত্রে a.obj এর একটি অনুলিপি রয়েছে এবং আপনার অন্য কোডটির একটি স্বতন্ত্র অনুলিপি রয়েছে। (কোডটির একাধিক অনুলিপি সহ চূড়ান্ত সম্পাদনযোগ্যকে ফোলায়ে ফেলা হচ্ছে)।

খ) static member function- অবজেক্ট ওরিয়েন্টেশনটি একটি স্থির পদ্ধতিকে কী বোঝায় । একটি ক্লাসের ভিতরে থাকে। আপনি ক্লাসের সাথে এটি কোনও বস্তুর উদাহরণের চেয়ে কল করেন

এই দুটি পৃথক স্থির ফাংশন সংজ্ঞা সম্পূর্ণ পৃথক। সাবধান - এখানে ড্রাগন হতে হবে।


ঠিক আছে, আমি যখনই ঠিক করি ঠিক না হওয়া পর্যন্ত স্থিতিশীলভাবে মেইন সিপিপিতে কিছু স্থান সাফ করার জন্য এটি করি do এটি করার জন্য কী আরও ভাল ধারণা আছে?
স্লাভা ভি

1
সি ++ এর সঠিক পরিভাষাটি সদস্য নয়, পদ্ধতি নয়। সি ++ লিগ্যালিতে কোনও "পদ্ধতি" নেই। পদ্ধতিটি একটি সাধারণ ওও পদ। সি ++ সদস্য ফাংশনের মাধ্যমে এগুলি প্রয়োগ করে।
ব্রায়ান নিল

14

স্থির ফাংশন সংজ্ঞা এই প্রতীকটি অভ্যন্তরীণ হিসাবে চিহ্নিত করবে। সুতরাং এটি বাইরে থেকে লিঙ্ক করার জন্য দৃশ্যমান হবে না, তবে কেবল একই সংকলন ইউনিটে সাধারণত একই ফাইলের ফাংশনে।


7

একটি স্ট্যাটিক ফাংশন এমন একটি যা ক্লাসের কোনও উদাহরণের বিপরীতে ক্লাসে ডাকা যেতে পারে।

উদাহরণস্বরূপ একটি অ স্থির হবে:

Person* tom = new Person();
tom->setName("Tom");

এই পদ্ধতিটি ক্লাসের উদাহরণে কাজ করে, ক্লাস নিজেই নয়। তবে আপনার কাছে একটি স্থিতিশীল পদ্ধতি থাকতে পারে যা কোনও উদাহরণ ছাড়াই কাজ করতে পারে। এটি কখনও কখনও কারখানার প্যাটার্নে ব্যবহৃত হয়:

Person* tom = Person::createNewPerson();

2
আমার কাছে মনে হচ্ছে আপনি স্থির "পদ্ধতি" সম্পর্কে কথা বলছেন, "ফাংশন" নয় ??
স্লাভা ভি

আমি ধরে নিয়েছি আপনি একটি শ্রেণীর মধ্যে স্থির ফাংশনগুলি উল্লেখ করছেন।
তোতারা

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

5
সি ++ তে কোনও "পদ্ধতি" নেই, কেবলমাত্র ফাংশন। সি ++ স্ট্যান্ডার্ড কখনও "পদ্ধতি", কেবল "ফাংশন" উল্লেখ করে না।
ব্রায়ান নিল

1
@ পুডল আমি জানি আপনি কী বলছেন তবে সি ++ স্ট্যান্ডার্ডে কোনও "পদ্ধতির" সংজ্ঞা নেই। সি ++ এর কেবল বিভিন্ন ধরণের ফাংশন রয়েছে। "পদ্ধতি" একটি সাধারণ ওও শব্দ এবং এটি অন্যান্য ভাষায় এবং অনানুষ্ঠানিকভাবে সি ++ এ ব্যবহৃত হয়। একটি পদ্ধতি আনুষ্ঠানিকভাবে সি ++ তে "সদস্য ফাংশন" হিসাবে পরিচিত।
ব্রায়ান নিল

7

মাইনর নাইট: স্ট্যাটিক ফাংশনগুলি অনুবাদ ইউনিটে দৃশ্যমান, যা বেশিরভাগ ব্যবহারিক ক্ষেত্রে ফাংশনটি সংজ্ঞায়িত করা ফাইল।

মানকটি সম্ভবত এর মতো কিছু বলে:

"প্রতিটি প্রোগ্রামে সেই প্রোগ্রামে ব্যবহৃত প্রতিটি ননলাইন ফাংশন বা অবজেক্টের ঠিক একটি সংজ্ঞা থাকবে; কোনও ডায়াগনস্টিকের প্রয়োজন নেই।"

এটি স্ট্যাটিক ফাংশনগুলি দেখার সি উপায়। এটি তবে সি ++ এ অবচয় করা হয়েছে।

সি ++ এ, অতিরিক্ত হিসাবে, আপনি সদস্য ফাংশন স্থির ঘোষণা করতে পারেন। এগুলি বেশিরভাগই মেটাফ্যাঙ্কশনসমূহ অর্থাত্‍ তারা কোনও নির্দিষ্ট বস্তুর আচরণ / অবস্থা বর্ণনা / পরিবর্তন করে না তবে পুরো শ্রেণিতেই কাজ করে। এছাড়াও, এর অর্থ হ'ল স্থিতিশীল সদস্য ফাংশনটি কল করার জন্য আপনাকে কোনও অবজেক্ট তৈরি করার দরকার নেই। আরও, এর অর্থ এটিও হ'ল আপনি কেবল এই জাতীয় ফাংশন থেকে স্থির সদস্যের ভেরিয়েবলগুলিতে অ্যাক্সেস পান get

আমি পার্টের উদাহরণে সিঙ্গেলটন প্যাটার্ন যুক্ত করব যা কোনও প্রোগ্রামের আজীবন কোনও একক বস্তু পেতে / ব্যবহার করতে এই স্ট্যাটিক সদস্য ফাংশনের এই ধরণের উপর ভিত্তি করে তৈরি হয়।


7

স্থির ফাংশনের উত্তর ভাষার উপর নির্ভর করে:

1) সি এর মতো ওওপিএসবিহীন ভাষাগুলিতে এর অর্থ এই যে ফাংশনটি কেবলমাত্র সেই ফাইলের মধ্যেই অ্যাক্সেসযোগ্য যেখানে এর সংজ্ঞা দেওয়া আছে।

২) সি ++ এর মতো ওওপিএস সহ ভাষাগুলিতে এর অর্থ হ'ল ফাংশনটির কোনও উদাহরণ তৈরি না করেই সরাসরি ক্লাসে কল করা যেতে পারে।


এটি সত্য নয়। আপনার দ্বিতীয় অনুচ্ছেদের ব্যাখ্যাটি কোনও শ্রেণীর " স্ট্যাটিক সদস্য ফাংশন " বোঝায় , " স্থির ফাংশন " নয়। সি ++ তে, একটি ফাংশনটির সাথে staticফাইল-স্কোপ রয়েছে যেমন এটি সি তে থাকে
রবার্টএস

0

স্ট্যাটিক ফাংশন যেহেতু এই ফাইলটিতে কেবল দৃশ্যমান। আসলে, সংকলক আপনার জন্য কিছু অপ্টিমাইজেশন করতে পারে যদি আপনি কিছু ফাংশনে "স্থিতিশীল" ঘোষণা করেন।

এখানে একটি সহজ উদাহরণ।

main.c

#include <stdio.h>

static void test() 
{
    ghost(); // This is an unexist function.
}

int main()
{
    int ret = 0;

#ifdef TEST
#else
    test();
#endif
    return (ret);
} 

এবং সংকলন

gcc -o main main.c

আপনি এটি ব্যর্থ দেখতে পাবেন। কারণ আপনি এমনকি ভূতের () ফাংশনটি প্রয়োগ করেন না।

কিন্তু যদি আমরা নিম্নলিখিত কমান্ড ব্যবহার করি।

gcc -DTEST -O2 -o main main.c

এটি সাফল্য , এবং এই প্রোগ্রামটি সাধারণত সম্পাদন করা যেতে পারে।

কেন? 3 মূল পয়েন্ট আছে।

  1. -ও 2: কমপায়ার অপ্টিমাইজেশনের স্তর কমপক্ষে 2।
  2. -ডিটিএসটি: টেস্ট সংজ্ঞায়িত করুন, সুতরাং পরীক্ষা () বলা হবে না।
  3. পরীক্ষার জন্য "স্থিতিশীল" সংজ্ঞায়িত ()।

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


0

" সি তে একটি" static"ফাংশন কী ? "

শুরুতে শুরু করা যাক।

এটি সবই "লিঙ্কেজ" নামক একটি জিনিসের উপর ভিত্তি করে:

" বিভিন্ন স্কোপে বা একই সুযোগে একাধিকবার ঘোষিত একটি শনাক্তকারীকে লিংকেজ নামক প্রক্রিয়া দ্বারা একই বস্তু বা ফাংশনকে উল্লেখ করতে পারেন 29 ২৯) এখানে তিন ধরণের সংযোগ রয়েছে: বাহ্যিক, অভ্যন্তরীণ এবং কোনওটিই নয় " "

সূত্র: সি 18, 6.2.2 / 1


"অনুবাদ ইউনিট এবং লাইব্রেরিগুলির সেটগুলিতে যা একটি সম্পূর্ণ প্রোগ্রাম গঠন করে, বাহ্যিক সংযোগ সহ একটি নির্দিষ্ট সনাক্তকারীর প্রতিটি ঘোষণা একই বস্তু বা ফাংশনকে বোঝায় one একটি অনুবাদ ইউনিটের মধ্যে, অভ্যন্তরীণ লিঙ্কেজ সহ সনাক্তকারীদের প্রতিটি ঘোষণা একই বস্তু বা ফাংশনকে চিহ্নিত করে "কোনও সংযুক্তি ছাড়াই শনাক্তকারীর প্রতিটি ঘোষণা একটি অনন্য সত্তাকে বোঝায়" "

সূত্র: সি 18, 6.2.2 / 2


যদি কোনও ফাংশন কোনও স্টোরেজ-শ্রেণীর নির্দিষ্টকরণ ছাড়াই সংজ্ঞায়িত করা হয় তবে ফাংশনটির externডিফল্টর সাথে একটি যোগসূত্র রয়েছে :

"যদি কোনও ফাংশনটির জন্য সনাক্তকারী ঘোষণার কোনও স্টোরেজ-শ্রেণীর নির্দিষ্টকরণকারক না থাকে তবে এর সংযোগটি ঠিক যেমন স্টোরেজ-শ্রেণীর নির্দিষ্টকরণকারী বহির্মুখী হিসাবে ঘোষিত হয়েছিল তা নির্ধারণ করা হয় ।"

সূত্র: সি 18, 6.2.2 / 5

এর অর্থ হ'ল - যদি আপনার প্রোগ্রামটি বেশ কয়েকটি অনুবাদ ইউনিট / উত্স ফাইল ( .cবা .cpp) সমন্বিত থাকে - আপনার প্রোগ্রামটি সমস্ত অনুবাদ ইউনিট / উত্স ফাইলগুলিতে ফাংশনটি দৃশ্যমান ।

এটি কিছু ক্ষেত্রে সমস্যা হতে পারে। যদি আপনি ফে দুটি ভিন্ন ফাংশন (সংজ্ঞা) ব্যবহার করতে চান তবে দুটি একই প্রসঙ্গে (আসলে ফাইল-প্রসঙ্গ) একই ফাংশনের নাম সহ কী করতে পারেন।

সি এবং সি ++ তে staticস্টোরেজ-ক্লাসের কোয়ালিফায়ার ফাইল স্কোপের কোনও ফাংশনে প্রয়োগ হয়েছিল ( সি ++ এর কোনও শ্রেণীর স্থায়ী সদস্য ফাংশন বা অন্য ব্লকের মধ্যে কোনও ফাংশন নয়) এখন সাহায্যের জন্য আসে এবং চিহ্নিত করে যে সম্পর্কিত ফাংশনটি কেবলমাত্র এর ভিতরেই দৃশ্যমান অনুবাদ ইউনিট / উত্স ফাইলটি এটি অন্য টিএলইউ / ফাইলগুলিতে নয় এবং সংজ্ঞায়িত করা হয়েছিল।

"যদি কোনও বস্তুর বা কোনও ফাংশনের জন্য কোনও ফাইল স্কোপ শনাক্তকরণের ঘোষণায় স্টোরেজ-শ্রেণীর নির্দিষ্টকরণকারী স্থিতিশীল থাকে তবে সনাক্তকারীটির অভ্যন্তরীণ যোগসূত্র থাকে 30 30)"


30) কোনও ফাংশন ঘোষণায় স্টোরেজ-শ্রেণীর স্পেসিফায়ারিটিকে কেবল ফাইলের সুযোগ থাকলে তা থাকতে পারে; 6.7.1 দেখুন।

সূত্র: সি 18, 6.2.2 / 3


সুতরাং, একটি staticফাংশন কেবল অর্থবোধ করে, iff:

  1. আপনার প্রোগ্রামটিতে বেশ কয়েকটি অনুবাদ ইউনিট / উত্স ফাইল ( .cবা .cpp) রয়েছে।

    এবং

  2. আপনি কোনও ফাংশনের সুযোগ ফাইলটিতে সীমাবদ্ধ করতে চান, যেখানে নির্দিষ্ট ফাংশনটি সংজ্ঞায়িত করা হয়েছে।

যদি এই উভয় প্রয়োজনীয়তা মেলে না, তবে কোনও ক্রিয়াকলাপের যোগ্যতা অর্জনের জন্য আপনাকে আপনার মাথাটি জড়িয়ে রাখতে হবে না static


পার্শ্ব নোট:

  • ইতিমধ্যে উল্লিখিত হিসাবে, একটি staticফাংশনের সি এবং সি ++ এর মধ্যে একেবারেই কোনও পার্থক্য নেই , কারণ এটি সি + থেকে উত্তরাধিকার সূত্রে প্রাপ্ত সি ++ বৈশিষ্ট্য is

    এটি গুরুত্বপূর্ণ নয় যে সি ++ সম্প্রদায়টিতে, নাম পরিবর্তনের পরিবর্তে নামকরণের জায়গাগুলিরstatic ব্যবহারের তুলনায় কোয়ালিফাইং ফাংশনগুলির অবমূল্যায়ন সম্পর্কে হৃদয় বিদারক বিতর্ক রয়েছে , প্রথমে C ++ 03 স্ট্যান্ডার্ডটিতে একটি বর্ধিত অনুচ্ছেদে শুরু করে ব্যবহারের ঘোষণা দিয়েছিল অমিত হিসাবে স্থিতিকর কাজগুলি যা শীঘ্রই কমিটি নিজেই সংশোধন করে সি ++ 11 এ সরানো হয়েছিল।

    এটি বিভিন্ন এসও প্রশ্নের সাপেক্ষে:

    অজ্ঞাত / বেনাম নেমস্পেস বনাম স্থির ফাংশন

    স্ট্যাটিকের চেয়ে নামবিহীন নেমস্পেসের শ্রেষ্ঠত্ব?

    নামবিহীন নামস্থান স্থির বিকল্পের জন্য কেন "উচ্চতর"?

    স্থির কীওয়ার্ডের অবমূল্যায়ন ... আর নেই?

    আসলে, এটি সি ++ স্ট্যান্ডার্ড অনুযায়ী এখনও অবচয় করা হয়নি। সুতরাং, staticফাংশন ব্যবহার এখনও বৈধ। এমনকি যদি নামহীন নামব্যবধান সুবিধা আছে, ব্যবহার বা না সি স্ট্যাটিক ফাংশন ব্যবহার করে ++, সম্পর্কে আলোচনা (মতামত ভিত্তিক) one's এক মন সাপেক্ষে এবং এই ওয়েবসাইট যে উপযুক্ত নাও সাথে।

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