সি কোথায় সি ++ এর উপসেট নয়? [বন্ধ]


116

আমি প্রচুর বইয়ে পড়েছি যে সি সি ++ এর একটি উপসেট।

কিছু বই বলে যে সি সামান্য বিবরণ বাদে সি ++ এর একটি উপসেট ।

কোডগুলি সিতে সংকলন করবে এমন কয়েকটি ক্ষেত্রে কী হবে তবে সি ++ নয়?

উত্তর:


135

আপনি যদি এর সাথে তুলনা C89করেন C++তবে এখানে কয়েকটি জিনিস দেওয়া আছে

সি ++ তে কোনও অস্থায়ী সংজ্ঞা নেই

int n;
int n; // ill-formed: n already defined

int [] এবং int [N] সামঞ্জস্যপূর্ণ নয় (সি ++ তে কোনও উপযুক্ত নয়)

int a[1];
int (*ap)[] = &a; // ill-formed: a does not have type int[]

কোনও কে & আর ফাংশন সংজ্ঞা শৈলী নয়

int b(a) int a; { } // ill-formed: grammar error

নেস্টেড স্ট্রাক্টের সি ++ তে শ্রেণি-স্কোপ রয়েছে

struct A { struct B { int a; } b; int c; };
struct B b; // ill-formed: b has incomplete type (*not* A::B)

কোন ডিফল্ট ইনট

auto a; // ill-formed: type-specifier missing

C99 অন্যান্য ক্ষেত্রে সম্পূর্ণ যুক্ত করে lot

পরামিতিগুলির অ্যারে মাত্রায় ঘোষণাপত্রের স্পেসিফায়ারগুলির কোনও বিশেষ পরিচালনা নেই

// ill-formed: invalid syntax
void f(int p[static 100]) { }

কোনও পরিবর্তনশীল দৈর্ঘ্যের অ্যারে নেই

// ill-formed: n is not a constant expression
int n = 1;
int an[n];

নমনীয় অ্যারে সদস্য নেই

// ill-formed: fam has incomplete type
struct A { int a; int fam[]; }; 

বিশ্লেষণকে বাড়িয়ে তোলার জন্য কোনও বাছাইকারী বাধা নেই

// ill-formed: two names for one parameter?
void copy(int *restrict src, int *restrict dst);

@ মেহর্দাদ, ধন্যবাদ ওও জানতেন না যে সি স্থির করে নেস্টেড স্ট্রাক্ট ঘোষণার সময় ইতিমধ্যে একটি পরিবর্তনশীল তৈরি করতে হবে।
জোহানেস স্কাউব - লিটব

3
C ++ এক থেকে অন্য (অকেজো) সি 89 রয়েছে: সিটিতে typedef;আইনী টিউ রয়েছে, তবে সি ++ তে নয়।
ফ্লেক্সো

auto a;নতুন সি ++ স্ট্যান্ডার্ড রিভিশনটিতে বৈধ কিনা তা লক্ষ্য করুন ।
ফুজ

3
@FUZxxl সত্যিই? ছাড়ের ধরণ কী হবে a?
জোহানেস স্কাউব -

3
@FUZxxl আহ ধন্যবাদ তাই auto x;নতুন সংশোধনটিতে বৈধ নয়, তবে উদাহরণস্বরূপ auto x = 0;। আমি প্রথমে কিছুটা হতবাক হয়ে গিয়েছিলাম :)
জোহানেস স্কাউব -

50

সি তে, sizeof('a')সমান sizeof(int)

সি ++ sizeof('a')তে সমান sizeof(char)


46
এটিকে সহজ করা যায়: সি তে, 'a'একটি int। সি ++ এ, 'a'একটি char
পিএমজি

38

সি ++ এর পাশাপাশি নতুন কীওয়ার্ড রয়েছে। নিম্নলিখিতটি বৈধ সি কোড তবে সি ++ এর অধীন সংকলন করবে না:

int class = 1;
int private = 2;
int public = 3;
int virtual = 4;

1
এটি সত্য, তবে এটি হ'ল সাবসেটের অর্থ।
ইয়েইয়েরম্যান

20
@ আইইয়েরম্যান: না it এটি একটি উপসেট হওয়ার জন্য, সমস্ত সি কোডও বৈধ সি ++ হতে হবে। এই উদাহরণে কোডটি বৈধ সি তবে সি ++ নয়।
জাল্ফ

24
না, সি যদি সি ++ এর কঠোর উপসেট হত তবে প্রতিটি সি প্রোগ্রামই একটি বৈধ সি ++ প্রোগ্রাম হতে পারে তবে এটি সত্য নয়। প্রশ্নটি কেন এটি সত্য নয় এবং এটি কেন এটির একটি উদাহরণ।
গ্রিমে পেরো

হা! এই সম্পর্কে ভাবেন নি!
গ্যাব রয়ের 17

20

প্রচুর জিনিস আছে। কেবল একটি সাধারণ উদাহরণ (এটি সি প্রমাণ করার পক্ষে যথেষ্ট হবে যে সি ++ এর সঠিক উপসেট নয়):

int* test = malloc(100 * sizeof(int));

সিতে কম্পাইল করা উচিত তবে সি ++ তে নয়।


3
সি ++ এর জন্য একটি স্পষ্ট কাস্ট প্রয়োজন int*
মেহরদাদ আফশারি

8
দীর্ঘ উত্তর: malloc রিটার্ন void *, যা সিতে যে কোনও পয়েন্টার টাইপের জন্য বরাদ্দ করা যেতে পারে, এবং সি ++ অন্য কোনও পয়েন্টার প্রকারের জন্য বরাদ্দ করা যায় না।
ড্যানিয়েল আর্উইকার

5
চিত্রশিল্পী: এএনএসআই সি 89 স্ট্যান্ডার্ড দ্বারা সংজ্ঞায়িত সি সংকলকটি অভিযোগ করা উচিত নয়।
মেহরদাদ আফশারি

7
এটি আইনী সি। Castালাই অপ্রয়োজনীয়, ভুল হওয়া সম্ভব, এবং <stdlib.h> অন্তর্ভুক্ত করতে ব্যর্থতা কভার করে। আমি মেহেরদাদের বক্তব্যকে সি তে লেখার সঠিক উপায় বলে মনে করি
ডেভিড থর্নলি

16
@ ইমাজিস্ট: আমি সাধারণত সি প্রোগ্রামারগুলির কাছ থেকে বিপরীত শুনতে পাই। তারা কাস্ট যুক্ত করার পক্ষে এটি দুর্বল স্টাইল হিসাবে বিবেচনা করে, কারণ এটি বাগগুলি গোপন করতে পারে। গুড সি কোড কাস্ট ব্যবহার করে না
জাল্ফ

16

C ++, যদি আপনি ডিক্লেয়ার একটি struct, unionঅথবা enumতার নামে কোনো কোয়ালিফায়ার ছাড়া অবিলম্বে অ্যাক্সেসযোগ্য:

struct foo { ... };
foo x; // declare variable

সি-তে, এটি কার্যকর হবে না কারণ প্রকারগুলি তাদের নিজস্ব পৃথক নেমস্পেসে লাইভ হিসাবে ঘোষণা করে। সুতরাং, আপনাকে লিখতে হবে:

struct foo { ... };
struct foo x; // declare variable

structদ্বিতীয় লাইনে সেখানে উপস্থিতি লক্ষ্য করুন । আপনার জন্য একই কাজ করতে হবে unionএবং enum(তাদের নিজ নিজ কীওয়ার্ড ব্যবহার করে), অথবা ব্যবহার typedefকৌতুক:

typedef struct { ... } foo;
foo x; // declare variable

ফলস্বরূপ, সি তে আপনার নামের মতো বিভিন্ন ধরণের বিভিন্ন ধরণের থাকতে পারে, যেহেতু আপনি খতম করতে পারেন:

struct foo { ... };
typedef enum { ... } foo;

struct foo x;
foo y;

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


1
আপনার শেষ উদাহরণ অবৈধ সি হল: তিনটি ট্যাগ ( struct, unionএবং enum) একই নামস্থান শেয়ার করুন। একটি ভাল উদাহরণ হতে পারেstruct foo { ... }; typedef enum { ... } foo;
schot

@ স্কট: আপনি অবশ্যই ঠিক আছেন, সংশোধনের জন্য আপনাকে ধন্যবাদ। আপডেট করা হয়েছে।
পাভেল মিনায়েভ

8

এটি আপনি কী ধরণের সি ব্যবহার করছেন তার উপরও নির্ভর করে। স্ট্রস্ট্রুপ 1982 এএনএসআই এবং 1990 আইএসও স্ট্যান্ডার্ডের সাথে সি ++ কে যতটা উপযুক্ত তার তুলনায় সামঞ্জস্যপূর্ণ করে তুলেছিল এবং 1995 এর সংস্করণ কিছুই পরিবর্তন করেনি। সি কমিটি ১৯৯৯ স্ট্যান্ডার্ডের সাথে কিছুটা ভিন্ন দিকে চলে গিয়েছিল এবং সি ++ কমিটি কিছু পরিবর্তনগুলির সাথে সামঞ্জস্য করতে পরবর্তী সি ++ স্ট্যান্ডার্ড (সম্ভবত পরের বছর বা তার বাইরে) পরিবর্তন করেছে।

স্ট্রাস্ট্রাপ "দ্য সি ++ প্রোগ্রামিং ল্যাঙ্গুয়েজ" এর পরিশিষ্ট বি 2-তে C90 / C95 এর সাথে অসঙ্গতিগুলি তালিকাভুক্ত করে, বিশেষ সংস্করণ (যা কিছু যুক্ত উপাদান সহ তৃতীয় সংস্করণ):

'a'একটি হল intসি, একটিchar সি ++ হবে।

একটি এনামের আকার int সিতে থাকে, অগত্যা সি ++ তে হয় না।

সি ++ আছে // এর লাইনের শেষের জন্য মন্তব্য , সি তা দেয় না (যদিও এটি একটি সাধারণ এক্সটেনশন)।

সি ++ এ, একটি struct foo {সংজ্ঞা fooগ্লোবাল নেমস্পেসে রাখে , অন্যদিকে সিতে এটি হিসাবে উল্লেখ করা উচিত struct foo। এটি একটি structসংজ্ঞাটি বাইরের স্কোপটিতে একটি নামকে ছায়া দেওয়ার অনুমতি দেয় এবং এর আরও কয়েকটি পরিণতি ঘটে। এছাড়াও, সি এর জন্য বৃহত্তর সুযোগের অনুমতি দেয়struct সংজ্ঞাগুলির মঞ্জুরি দেয় এবং তাদের রিটার্ন টাইপ এবং আর্গুমেন্ট ধরণের ঘোষণায় মঞ্জুরি দেয়।

সি ++ সাধারণভাবে প্রকারভেদ সম্পর্কে ফ্যাসিয়ার। এটি কোনও পূর্ণসংখ্যাকে একটিতে নির্ধারিত হতে দেয় না enumএবং void *কাস্ট ব্যতীত অন্য পয়েন্টার ধরণের ক্ষেত্রে অবজেক্টগুলি বরাদ্দ করা যায় না। সি তে, একটি ওভারলেজ ইনিশিয়ালাইজার সরবরাহ করা সম্ভব (char name[5] = "David" যেখানে সি নাল চরিত্রটি বাতিল করবে)।

C89 intঅনেক প্রসঙ্গে অন্তর্ভুক্ত অনুমোদিত , এবং সি ++ দেয় না। এর অর্থ হ'ল সমস্ত ফাংশন অবশ্যই সি ++ এ ঘোষণা করতে হবে, যখন সি 98 intএ ফাংশন ঘোষণায় প্রযোজ্য সমস্ত কিছুর জন্য ধরে নিয়ে প্রায়শই সম্ভব হত ।

সি-তে, লেবেলযুক্ত বিবৃতি ব্যবহার করে কোনও ব্লকের বাইরে থেকে অভ্যন্তরে প্রবেশ করা সম্ভব। সি ++ এ, যদি এটি কোনও সূচনা এড়িয়ে যায় তবে এটি অনুমোদিত নয়।

বাহ্যিক সংযোগে সি আরও উদার। সি-তে, একটি গ্লোবাল constভেরিয়েবল সুস্পষ্টভাবে হয় externএবং এটি সি ++ তে সত্য নয়। সি একটি বিশ্বব্যাপী ডেটা অবজেক্টকে বেশ কয়েকবার ছাড়াই ঘোষিত করার অনুমতি দেয় externতবে এটি সি ++ তে সত্য নয়।

অনেক সি ++ কীওয়ার্ড সি-তে কীওয়ার্ড নয় বা #defineস্ট্যান্ডার্ড সি শিরোনামে থাকে।

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

এটি স্ট্রস্ট্রপ থেকে সমস্ত কিছু কভার করে বলে মনে হচ্ছে।


আসুন সত্যটি ভুলে যাবেন না যে, সিতে আপনাকে অবশ্যই একটি স্কোপের শুরুতে ভেরিয়েবলগুলি ঘোষণা করতে হবে (অর্থাত্, একটি খোলার বন্ধনী পরে অবিলম্বে), তবে, সি ++ কোথাও ভেরিয়েবল ঘোষণার অনুমতি দেয়।
রবিএইচ

4
যাইহোক, এটি এমন কিছু যা সি ++ এমনটি করতে পারে যা সি করতে পারে না। আমি মনে করি আমরা সি তে করতে পারে এমন জিনিসগুলিতে আমরা নজর দিচ্ছি তবে সি ++ নয়।
ডেভিড থর্নলি

2
@ রব: এটি সি 98 এর পক্ষে সত্য তবে সি 99 এর পক্ষে নয়।
jamesdlin

6

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

(এটি কঠোরভাবে প্রশ্নের উত্তর দেয় না, তবে লোকেরা এটি পছন্দ করতে পারে)।


1
আমি ভেবেছিলাম আমি কোনও
উত্তরহীন

4

আমার মনে হয় একক বৃহত্তম পার্থক্য হ'ল এটি একটি বৈধ সি উত্স ফাইল:

int main()
{
    foo();
}

নোট করুন যে আমি ঘোষণা করিনি foo কোথাও ।

ভাষার পার্থক্য বাদে, সি ++ লাইব্রেরিতে এটি কিছু পরিবর্তন করে যা এটি সি থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়, যেমন কিছু ফাংশন const char *পরিবর্তে ফিরে আসে char *


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

1
আপনার করা উচিত s,C,C89,এবং নোট করা উচিত যে এটি একটি অবৈধ C99 উত্স ফাইল।
জোহানেস স্কাউব -

এটি কি অবৈধ বা কেবল C99 এ অবহেলিত?
জুলফ

2
@ জাল্ফ সি 99 খসড়া সি 98-এ পরিবর্তিত নথিবদ্ধ করে এবং এতে "অন্তর্ভুক্ত ইন্টিমেট রিমুভ" এবং "অন্তর্ভুক্ত ফাংশন ঘোষণার অপসারণ" উভয়ই অন্তর্ভুক্ত রয়েছে।
জোহানেস স্কাউব -


2

এখানে বেশিরভাগ উত্তরের বাক্য সংশ্লেষের পার্থক্য রয়েছে যা সি ++ সংকলকগুলিকে সি 98 (বা সি 99) উত্স কোডে ব্যর্থ হতে পারে। তবে কিছু সূক্ষ্ম ভাষার পার্থক্য রয়েছে যা উভয় ভাষায়ই বৈধ তবে এটি বিভিন্ন আচরণের জন্ম দিতে পারে। sizeof (char)পার্থক্য হচ্ছে নবীন উল্লিখিত একটি উদাহরণ, কিন্তু একটি প্রোগ্রাম যা প্রিন্ট হবে "সি" যদি কোনো (ANSI) সি প্রোগ্রাম হিসাবে কম্পাইল, এবং "সি ++" যদি কোন সি ++ প্রোগ্রাম হিসাবে কম্পাইল লিখুন কিছু অন্যদের তালিকা।


-2

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


-2

আপনি কেবল বাক্য গঠন দ্বারা ভাষার তুলনা করতে পারবেন না। আপনি যদি এটি করেন তবে আপনি সি ++ এর উপসেট হিসাবে দেখতে পাবেন। আমার মতে সি ++ ওও (এবং সি নয়) এই সত্যটি যথেষ্ট যে সি এবং সি ++ বিভিন্ন ভাষা।


2
ভুল। সি ++ হয় না কেবল ওও নয়। আপনি সি ++ "সি ++ = সি + ওও + জেনেরিক প্রোগ্রামিং + বোনাস" এর মতো কিছু ভাবতে পারেন। এটিকে অন্য উপায়ে রাখতে, "সি এবং সি ++ ~ = সি" যেখানে ~ = এর অর্থ প্রায় সমান।
প্যারাসেবল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.