কেন এএনএসআই সি এর নামস্থান নেই?


97

নেমস্পেস থাকা বেশিরভাগ ভাষার ক্ষেত্রেই বুদ্ধিমানের মতো মনে হয়। তবে আমি যতদূর বলতে পারি, এএনএসআই সি এটি সমর্থন করে না। কেন না? এটি কোনও ভবিষ্যতের মান অন্তর্ভুক্ত করার পরিকল্পনা আছে?


13
সি ++ সি-উইথ-নেমস্পেস হিসাবে ব্যবহার করুন!
আরাক

4
আমি অবশ্যই করতে পারি, তবে আমি এখনও জানতে চাই
পুলকিত সিনহা

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

4
@ ক্রিস বেক: আমি স্বতন্ত্র সিনট্যাক্স পছন্দ করি। আমি জানতে চাই যে আমি কোনও নামের জায়গাতে ক্লাসে দেখছি বা কোনও শ্রেণীর সদস্য।
জেরেমিপ

6
@ ক্রিসবেক, এটি কয়েক বছর দেরি হয়ে গেছে, তবে আপনার মতে আকর্ষণীয় যে আপনার যুক্তি যে C ++ নেমস্পেসগুলি খারাপভাবে প্রয়োগ করা হয়েছিল, তাই সেগুলিকে সি তে প্রয়োগ করা উচিত নয় তবে আপনি লক্ষ করুন যে অন্যান্য ভাষাগুলি সি ++ এর হ্যাঙ্গআপ ব্যতীত এগুলি প্রয়োগ করে। অন্যান্য ভাষাগুলি যদি এটি করতে পারে তবে সেগুলিকে সি এর সাথে পরিচয় করিয়ে দিবে না কেন ?
weberc2

উত্তর:


69

সি এর নেমস্পেস রয়েছে। কাঠামো ট্যাগগুলির জন্য একটি, এবং অন্য ধরণের। নিম্নলিখিত সংজ্ঞা বিবেচনা করুন:

প্রথমটির ট্যাগ ট্যাগ রয়েছে এবং পরে টাইপফের সাথে টাইপ ফু তৈরি করা হবে। তবুও নাম-সংঘর্ষ হয় না। এটি কারণ কাঠামোগত ট্যাগ এবং প্রকারগুলি (অন্তর্নির্মিত প্রকার এবং টাইপডেফ'যুক্ত প্রকারগুলি) পৃথক নেমস্পেসে থাকে।

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

সম্পাদনা: জেরেমিপি ভাগ্যক্রমে আমাকে সংশোধন করেছে এবং যে নামের জায়গাটি আমি মিস করেছি তা উল্লেখ করেছে। লেবেলগুলির জন্য এবং স্ট্রাক্ট / ইউনিয়ন সদস্যদের জন্যও নেমস্পেস রয়েছে।


8
এখানে দুটিরও বেশি জায়গার নাম রয়েছে। আপনি যে দুটি উল্লেখ করেছেন সেগুলি ছাড়াও প্রতিটি স্ট্রাক্ট এবং ইউনিয়নের সদস্যদের জন্য লেবেল এবং নামের জায়গাগুলির একটি নাম স্থান রয়েছে।
জেরেমিপ

@ জেরেমিপি: সংশোধন করার জন্য অনেক ধন্যবাদ। আমি কেবল এটি বন্ধ করে দিয়েছি, আমি স্ট্যান্ডার্ডটি পরীক্ষা করেছিলাম না :-)

4
ফাংশনগুলির জন্য নেমস্পেস সম্পর্কে কী?
থিশাইহাই

8
এটিকে নামক্ষেত্র হিসাবে ভাল বলা যেতে পারে, তবে আমি বিশ্বাস করি যে এগুলি ওপি জিজ্ঞাসা করছিল এমন নামের স্থান নয় sort
avl_swen

4
@ জেটেরম না আমি হ্যাকিং সি বৈশিষ্ট্যগুলি সমর্থন করছি না, কেবল ঘটনা বর্ণনা করছি। প্রতিটি structসংজ্ঞা তার সদস্যদের জন্য একটি নতুন নেমস্পেস ঘোষণা করে। আমি এই সত্যটি কাজে লাগানোর পক্ষে বলছি না এবং এর ব্যবহারের কোনও উপায় সম্পর্কে আমি অবগত নই, কারণ structএর স্থির সদস্য থাকতে পারে না।
জেরেমিপ

103

সম্পূর্ণতার জন্য সি-তে নেমস্পেসগুলি থেকে আপনি পেতে পারেন এমন "বেনিফিট" অর্জনের বিভিন্ন উপায় রয়েছে

আমার প্রিয় পদ্ধতিগুলির মধ্যে একটি হ'ল কাঠামোটি ব্যবহার করে এমন একাধিক পদ্ধতি পয়েন্টার রাখার জন্য যা আপনার লাইব্রেরি / ইত্যাদির ইন্টারফেস are

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

কিছু অতিরিক্ত রক্ষণাবেক্ষণ জড়িত রয়েছে তবে আমি মনে করি এটি ন্যূনতম।

এখানে একটি উদাহরণ:

এর ব্যবহার . সিনট্যাক্স ক্লাসিক লাইব্রেরি_ফাংশন () লাইব্রেরী_সুম_মূল্য পদ্ধতির উপর একটি শক্তিশালী সমিতি তৈরি করে। তবে কিছু সীমাবদ্ধতা রয়েছে যার একটিতে আপনি ম্যাক্রোগুলিকে ফাংশন হিসাবে ব্যবহার করতে পারবেন না।


12
... এবং সংকলকগুলি যখন আপনি যখন সংকলন করবেন তখন ফাংশন পয়েন্টারটিকে "dereferences" করতে যথেষ্ট স্মার্ট library.method1()?
einpoklum

4
এটি এত দুর্দান্ত। একটি জিনিস আমি যুক্ত করতে পারি, আমি আমার .cফাইলে আমার সমস্ত ফাংশনগুলি ডিফল্টরূপে স্থিতিশীল করার চেষ্টা করে যাচ্ছি , সুতরাং কেবলমাত্র প্রকাশিত ফাংশনগুলিই ফাইলের const structসংজ্ঞাতে স্পষ্টভাবে উদ্ভাসিত হয় .c
সর্বশেষে

4
এটি দুর্দান্ত ধারণা, তবে আপনি ধ্রুবক এবং এনামগুলিকে কীভাবে মোকাবেলা করবেন?
এখন

4
@ আইনপোকলুম - নেক্রোকে দুঃখিত, তবে কমপক্ষে .3.৩.০ সংস্করণ হিসাবে, জিসিসি function1/ এবং method2উভয়ের সাথে সংকলনের সময় / এর আসল ঠিকানাটি গণনা করবে । আপনি যদি নিজের উত্স সহ এই জাতীয় লাইব্রেরিগুলি সংকলন না করেন তবে এই পদ্ধতিটি এর ফাংশন কলগুলিতে কিছু ওভারহেড যুক্ত করবে। -O2-flto
অ্যালেক্স রিঙ্কিং

4
@ অ্যালেক্সারিংকিং: ওয়েল, এটি দুর্দান্ত, তবে আমরা এই ফাংশনগুলিকে কখনই অন্তর্ভুক্ত করব না। এবং - নেক্রোইং দুর্দান্ত, কোনও ক্ষমা চাওয়ার দরকার নেই।
einpoklum

26

সি এর নেমস্পেস রয়েছে। বাক্য গঠনটি হ'ল namespace_name। এমনকি আপনি এটিকে বাসা হিসাবে বাসাতে পারেন general_specific_name। এবং আপনি যদি প্রতিবার নেমস্পেসের নাম না লিখে নাম অ্যাক্সেস করতে সক্ষম হতে চান তবে একটি শিরোনাম ফাইলে সম্পর্কিত প্রিপ্রোসেসর ম্যাক্রোগুলি অন্তর্ভুক্ত করুন eg

নাম মাংলিংয়ের তুলনায় এটি অনেক বেশি পরিচ্ছন্ন এবং নির্দিষ্ট ভাষা নেমস্পেসগুলি সরবরাহ করতে প্রতিশ্রুতিবদ্ধ অন্যান্য নৃশংসতা।


24
আমি এটি অন্যভাবে দেখুন। ব্যাকরণকে জটিল করে তোলা, প্রতীকগুলির উপর নাম ম্যাঙ্গেলিং প্রবর্তন করা ইত্যাদি এমন কিছু অর্জনের জন্য যা প্রিপ্রোসেসরের সাথে ইতিমধ্যে তুচ্ছ ছিল যা আমি একটি নোংরা হ্যাক এবং দুর্বল নকশা বলব।
আর .. গীটহাব বন্ধ করুন ICE

41
আপনি সত্যিই কীভাবে এই অবস্থানটি সমর্থন করতে পারেন তা আমি দেখছি না। জাভাস্ক্রিপ্ট সম্প্রদায়কে প্রকল্পগুলি সংহত করার বিষয়ে জিজ্ঞাসা করুন যখন নেমস্পেসগুলি বাস্তবায়নের জন্য প্রতিটি অন্যান্য সিস্টেমে আলাদা হোমগ্রাউন হ্যাক থাকে। আমি কখনই 'নেমস্পেস' বা 'প্যাকেজ' কীওয়ার্ড সম্পর্কে কোনও ভাষা তাদের ভাষায় খুব জটিলতা যুক্ত করতে শুনিনি। অন্যদিকে, ম্যাক্রো দিয়ে লিটারযুক্ত কোড ডিবাগ করার চেষ্টা করা লোমশ দ্রুত পেতে পারে!
weberc2

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

6
@ আর .. সি ++ তে নাম জালিয়াতি মানক করা থাকলে এটি ঘটবে না। এটি একা এবিআইয়ের সামঞ্জস্যতা নিয়ে সহায়তা করবে না, তবে অবশ্যই নাম ম্যাপিংয়ের সমস্যাটি সমাধান করবে।
ম্যালকম

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

12

.তিহাসিকভাবে, সি সংকলকগুলির নামগুলি ম্যাঙ্গেল করে না (তারা উইন্ডোতে করে তবে cdeclকলিং কনভেনশনের জন্য ম্যাঙ্গিলিং কেবল একটি আন্ডারস্কোর উপসর্গ যুক্ত করে)।

এটি অন্যান্য ভাষা (এসেম্বারার সহ) এর সি লাইব্রেরিগুলি ব্যবহার করা সহজ করে তোলে এবং আপনি প্রায়শই extern "C"সি ++ এপিআইয়ের জন্য মোড়ক দেখেন এমন একটি কারণ ।


4
তবে কেন এমন সমস্যা হচ্ছে? আমার অর্থ, ধরুন যে সমস্ত নেমস্পিড নাম _da13cd6447244ab9a30027d3d0a08903 দিয়ে শুরু হবে এবং তারপরে নামটি (এটি একটি ইউইউডি ভি 4 আমি স্রেফ উত্পন্ন করেছি)? এই বিশেষ ইউআইডি ব্যবহার করে এমন নামগুলি ভঙ্গ করতে পারে এমন একটি সুযোগ রয়েছে তবে সেই সুযোগটি মূলত শূন্য। সুতরাং বাস্তবে কেবল_নামস্পেস_নামের ম্যাংলিংয়ে সমস্যা হবে না ।
einpoklum

7

শুধু historicalতিহাসিক কারণ। সেই সময় নেমস্পেসের মতো কিছু থাকার কথা কেউ ভাবেনি। এছাড়াও তারা ভাষাটি সহজ রাখার চেষ্টা করেছিল। ভবিষ্যতে তাদের এটি থাকতে পারে


4
ভবিষ্যতে সিতে নামের স্থান যুক্ত করতে স্ট্যান্ডার্ড কমিটিতে কোনও আন্দোলন আছে কি? সি / সি ++ মডিউল এ সরানো সম্ভব যা ভবিষ্যতে এটি আরও সহজ করে তুলতে পারে?
ল্যানোএক্সেক্স

4
@lanoxx পিছনে সামঞ্জস্যতার কারণে সিতে নেমস্পেস যুক্ত করার কোনও ইচ্ছা নেই।
থিমহাই

6

কোনও উত্তর নয়, তবে কোনও মন্তব্য নয়। সি namespaceস্পষ্টভাবে সংজ্ঞায়নের কোনও উপায় সরবরাহ করে না । এটির পরিবর্তনশীল সুযোগ রয়েছে। উদাহরণ স্বরূপ:

আপনি ভেরিয়েবল এবং ফাংশনগুলির জন্য যোগ্য নাম ব্যবহার করতে পারেন:

নাম স্থান থেকে একমাত্র পার্থক্য যা আপনি হতে usingপারবেন না এবং আমদানি করতে পারবেন না from mylib


আপনি সর্বশেষ দুটি লাইনও প্রতিস্থাপন করতে পারবেন না namespace mylib { void init(); void say_hello(); }যা এটিও গুরুত্বপূর্ণ (ইশ)।
einpoklum

3

নেমস্পেসগুলি হওয়ার আগে এএনএসআই সি আবিষ্কার করা হয়েছিল।


10
ইহা ছিল? প্রথম এএনএসআই সি স্পেক ছিল 1989. আমি বেশ নিশ্চিত যে নেমস্পেসগুলি (কোনও না কোনও রূপে) তখন প্রোগ্রামিং ভাষায় ছিল। উদাহরণস্বরূপ, অ্যাডা 1983 সালে মানক করা হয়েছিল এবং নাম স্থান হিসাবে প্যাকেজ ছিল। ঘুরেফিরে এগুলি মূলত মডিউল -২ মডিউলগুলির উপর ভিত্তি করে ছিল।
আমার সঠিক মতামত

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

এএনএসআই সি-এর প্রাক-এএনএসআই সি থেকে কিছু উল্লেখযোগ্য পার্থক্য ছিল, তবে নেমস্পেসগুলি সেগুলির একটি নয়।
dan04

ইতিমধ্যে, আমি এটি ২০২০ সালে লিখছি, নেমস্পেসগুলি অস্তিত্ব লাভের পরে। সর্বশেষতম সি স্ট্যান্ডার্ডগুলিতে এখনও সেগুলি নেই। সি যতটা বোঝায়, এটি একটি বৈশিষ্ট্য যা খুব খারাপভাবে অনুপস্থিত।

3

কারণ যে লোকেরা এই ক্ষমতাটি সিতে যুক্ত করতে চায় তারা একত্রিত হয় নি এবং সংকলক লেখক দল এবং আইএসও সংস্থাগুলিতে কিছুটা চাপ দেওয়ার জন্য সংগঠিত হয়নি।


4
আমি মনে করি আমরা সিতে নেমস্পেসটি দেখতে পাব কেবলমাত্র যদি এই লোকেরা নিজেরাই সংগঠিত করে এবং নেমস্পেস সমর্থন দিয়ে একটি এক্সটেনশন (গুলি) তৈরি করে। তারপরে আইএসও সংস্থাগুলির কোনও বিকল্প থাকবে না তবে এগুলি স্ট্যান্ডার্ড হিসাবে প্রকাশিত করুন (আরও কম-বেশি পরিবর্তন সহ)। এটি জাভাস্ক্রিপ্ট (এটির সাথে সি এর সাথে কিছু মিল রয়েছে) এটি করেছে।
থিসহাই

4
@ থেমিহাই: "একটি এক্সটেনশন তৈরি করুন" = জিসিসি এবং জড়িতদের নাম স্পেসগুলি সংকলনের জন্য পান।
einpoklum

1

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

নেমস্পেস এবং / অথবা টেমপ্লেটগুলি সি ব্যবহার করে কীভাবে সুবিধা পাবেন সে সম্পর্কে আমি একটি টিউটোরিয়াল লিখেছিলাম

নেমে স্পেস এবং টেমপ্লেট সি

সি তে নেমস্পেস এবং টেম্পলেটগুলি (লিঙ্কযুক্ত তালিকাগুলি ব্যবহার করে)

বেসিক নেমস্পেসের জন্য, একটি সাধারণভাবে একটি সম্মেলন হিসাবে নেমস্পেসের নামটির উপসর্গ করতে পারে।

হিসাবে লেখা যেতে পারে

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

নিম্নলিখিত হিসাবে টেমপ্লেট ফাইল ব্যবহার করে

গুণ - টেমপ্লেট

গুণ - টেমপ্লেট

আমরা এখন অন্তর্নির্মিতভাবে নিম্নলিখিত হিসাবে সংজ্ঞা দিতে পারি। এই উদাহরণে, আমি একটি int_m Multiply.h / .c ফাইল তৈরি করব।

int_m Multiply.h

int_m Multiply.c

এই সমস্ত শেষে, আপনার জন্য একটি ফাংশন এবং শিরোনাম ফাইল থাকবে।

আমি সরবরাহিত লিঙ্কগুলিতে আরও একটি বিস্তারিত টিউটোরিয়াল তৈরি করেছি যা লিঙ্কযুক্ত তালিকার সাথে এটি কীভাবে কাজ করে তা দেখায়। আশা করি এটি কাউকে সাহায্য করবে!


4
আপনার লিঙ্কগুলি কীভাবে নাম স্থান যুক্ত করবেন তা ব্যাখ্যা করে। তবে, প্রশ্নটি ছিল কেন নেমস্পেসগুলি সমর্থিত নয়। সুতরাং এই উত্তরটি কোনও উত্তর নয় এবং পরিবর্তে একটি মন্তব্য হওয়া উচিত।
টমাস ওয়েলার 21
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.