অপরিজ্ঞাত সি ++ আচরণ সি সংজ্ঞায়িত আচরণের সাথে মিলিত হলে কী ঘটে?


10

আমার কাছে একটি *.cppফাইল রয়েছে যা আমি সি ++ (কোনও সি সংকলক নয়) দিয়ে সংকলন করি। সমন্বিত ফাংশনটি একটি কাস্টের উপর নির্ভর করে (শেষ লাইনটি দেখুন) যা সিতে সংজ্ঞায়িত বলে মনে হচ্ছে (দয়া করে আমি ভুল হলে সংশোধন করুন!), তবে এই বিশেষ ধরণের জন্য সি ++ তে নয়।

[...] C++ code [...]

struct sockaddr_in sa = {0};
int sockfd = ...;
sa.sin_family = AF_INET;
sa.sin_port = htons(port);
bind(sockfd, (struct sockaddr *)&sa, sizeof sa);

[...] C++ code [...]

যেহেতু আমি এটি একটি সি ++ ফাইলে সংকলন করছি, এটি কি এখন সংজ্ঞায়িত বা অপরিবর্তিত আচরণ? বা এটিকে কোনও *.cসংজ্ঞায়িত আচরণ করার জন্য, আমাকে একটি ফাইলের মধ্যে স্থানান্তরিত করতে হবে?


1
ফাইল এক্সটেনশনের কোনও অর্থ নেই; আপনি যদি এটি সি বা সি ++ হিসাবে সংকলন করেন তবেই।
ফ্রেডরিক

1
সম্পর্কিত প্রকারগুলি একে অপরের কাছ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয় না এবং তাদের কোনও সম্পর্ক নেই এবং এটি সি ++ এ অপরিবর্তিত
ড্যানিয়েল স্টিফেন্স

1
সাধারণত, যদি ফাইলটির .cএক্সটেনশন থাকে তবে সি সংকলকটি স্বয়ংক্রিয়ভাবে আহ্বান করা হয়।
ইগোর আর।

1
আমি সি ++ কোডে সর্বদা সেই কৌশলটি করি। কেন এটি আপনার পক্ষে কাজ করবে না ধারণা নেই। কোথাও একটি শিরোনাম অনুপস্থিত?
ব্যবহারকারী 4581301

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

উত্তর:


6

এটি সি ++ এবং সি উভয় ক্ষেত্রেই সংজ্ঞায়িত করা হয়েছে এটি কঠোরভাবে আলিয়জিং আইনগুলি লঙ্ঘন করে না কারণ এটি ফলাফলের পয়েন্টারটিকে অবজ্ঞা করে না।

এখানে সি ++ (@ ইন্টারজে ও @ ভিটিটি-র ধন্যবাদ) এর উদ্ধৃতি যা এটির অনুমতি দেয়:

কোনও অবজেক্ট পয়েন্টারকে স্পষ্ট করে আলাদা ধরণের অবজেক্ট পয়েন্টারে রূপান্তর করা যায়।

সি এর উদ্ধৃতি এখানে রয়েছে (ধন্যবাদ @ স্টেটরি টেলার) যা এটির অনুমতি দেয়:

কোনও অবজেক্ট টাইপের একটি পয়েন্টারকে পয়েন্টারটিতে আলাদা আলাদা অবজেক্ট টাইপের রূপান্তর করা যেতে পারে।

এগুলি নির্দিষ্ট করে যে কোনও পয়েন্টার প্রকারটি বিনা পরিণতিতে অন্য পয়েন্টার ধরণের (এবং তারপরে optionচ্ছিকভাবে রূপান্তরিত) রূপান্তর করতে পারে।

এবং এখানে পসিক্সের উদ্ধৃতি যা এই নির্দিষ্ট ক্ষেত্রেটিকে অনুমতি দেয়:

Sockaddr_in গঠন ইন্টারনেট ঠিকানা পরিবারের জন্য ঠিকানাগুলি সংরক্ষণ করতে ব্যবহৃত হয়। সকেট ফাংশন সহ ব্যবহারের জন্য এই ধরণের পয়েন্টারগুলিকে স্ট্রাক্ট সোকাড্রেআর * এ প্রয়োগ করতে হবে।

যেহেতু এই ফাংশন ( bind) সি স্ট্যান্ডার্ড লাইব্রেরির অংশ, ভিতরে যা কিছু ঘটে যায় (বিশেষত, টাইপ-কাস্টেড পয়েন্টারকে অবজ্ঞা করা) এর অপরিজ্ঞাত আচরণ হয় না।


আরও সাধারণ প্রশ্নের উত্তর দিতে:

সি এবং সি ++ দুটি পৃথক ভাষা। যদি কিছু সি তে সংজ্ঞায়িত করা হয় তবে সি ++ এ নয় তবে এটি সিতে সংজ্ঞায়িত করা হয় তবে সি ++ তে নয়। দুটি ভাষার মধ্যে কোনও অন্তর্নিহিত সামঞ্জস্যতা এটি পরিবর্তন করবে না। আপনি যদি সি ব্যবহার করতে চান যা সি-তে সংজ্ঞায়িত তবে সি ++ এ সংজ্ঞায়িত হয়েছে, আপনাকে কোডটি সংকলনের জন্য একটি সি সংকলক ব্যবহার করতে হবে।


1
@ ইনটারজয় আপনি কি স্ট্যান্ডার্ডের একটি উদ্ধৃতি দিয়ে এই ব্যাক আপ করতে পারবেন (সি বা সি ++ হয় ভাল)?
এসএস অ্যানি


1
ধন্যবাদ স্টিরিটেলার পরিবর্তে, HTTP সংস্করণ যুক্ত করা হয়েছে।
এসএস অ্যানি

2
যুক্তিযুক্তভাবে এটি পসিএক্স স্ট্যান্ডার্ডের একটি ত্রুটি - দ্বিতীয় যুক্তিটি হওয়া bindউচিত const void *, তবে সি ভাষায় bindঅস্তিত্বের পূর্বাভাস দেয় void(এবং আদৌ সি ++ এর অস্তিত্ব)। তারা এটি যোগ করতে এক পর্যায়ে আপডেট করেছে const, তবে কখনও কখনও মৌলিক প্রকারটি ঠিক করে নি।
ক্রিস ডোড

1
আমি এই আলাপটি সুপারিশ করতে পারি youtube.com/watch?v=_qzMpk-22cc আমি এখনও নিশ্চিত নই যে এটির উত্তরটি বৈধতা দেয় কিনা, বা যদি এটি আসলে বিপরীতভাবে বলে থাকে: -ও সি ++ একটি দুঃস্বপ্ন .. লোল
ড্যানিয়েল স্টিফেনস

-3

সি এবং সি ++ কোডের মধ্যে থাকা কলগুলি সংশ্লিষ্ট মানগুলির দৃষ্টিকোণ থেকে, অনির্ধারিত আচরণের ডাক দেয় তবে বেশিরভাগ প্ল্যাটফর্ম এগুলিকে নির্দিষ্ট করে specify

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


প্রথম অনুচ্ছেদ: "সি এবং সি ++ কোডের মধ্যে থাকা সমস্ত কলই অনির্ধারিত আচরণের ডাক দেয়" এমনকি যদি "অনিচ্ছাকৃত আচরণের আহ্বান" (যা নেই) তখনও এর কোনও অর্থ হয় না।
অরবিটে

দ্বিতীয় অনুচ্ছেদ: আপনি কী বলার চেষ্টা করছেন তা ধারণা নেই।
অরবিটে

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

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