উত্তর:
আপনি যদি এর সাথে তুলনা C89
করেন C++
তবে এখানে কয়েকটি জিনিস দেওয়া আছে
int n;
int n; // ill-formed: n already defined
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);
typedef;
আইনী টিউ রয়েছে, তবে সি ++ তে নয়।
auto a;
নতুন সি ++ স্ট্যান্ডার্ড রিভিশনটিতে বৈধ কিনা তা লক্ষ্য করুন ।
a
?
auto x;
নতুন সংশোধনটিতে বৈধ নয়, তবে উদাহরণস্বরূপ auto x = 0;
। আমি প্রথমে কিছুটা হতবাক হয়ে গিয়েছিলাম :)
সি ++ এর পাশাপাশি নতুন কীওয়ার্ড রয়েছে। নিম্নলিখিতটি বৈধ সি কোড তবে সি ++ এর অধীন সংকলন করবে না:
int class = 1;
int private = 2;
int public = 3;
int virtual = 4;
প্রচুর জিনিস আছে। কেবল একটি সাধারণ উদাহরণ (এটি সি প্রমাণ করার পক্ষে যথেষ্ট হবে যে সি ++ এর সঠিক উপসেট নয়):
int* test = malloc(100 * sizeof(int));
সিতে কম্পাইল করা উচিত তবে সি ++ তে নয়।
int*
।
void *
, যা সিতে যে কোনও পয়েন্টার টাইপের জন্য বরাদ্দ করা যেতে পারে, এবং সি ++ অন্য কোনও পয়েন্টার প্রকারের জন্য বরাদ্দ করা যায় না।
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
struct
, union
এবং enum
) একই নামস্থান শেয়ার করুন। একটি ভাল উদাহরণ হতে পারেstruct foo { ... }; typedef enum { ... } foo;
এটি আপনি কী ধরণের সি ব্যবহার করছেন তার উপরও নির্ভর করে। স্ট্রস্ট্রুপ 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)
।
এটি স্ট্রস্ট্রপ থেকে সমস্ত কিছু কভার করে বলে মনে হচ্ছে।
আপনি যদি জিসিসি ব্যবহার করেন, আপনি সতর্কতাটি ব্যবহার করতে পারেন -Wc++-compat
সি কোড সম্পর্কে কোনও সতর্কতা যা কোনওভাবে সি ++ তে সন্দেহজনক। এটি বর্তমানে জিসিসি নিজেই ব্যবহৃত হয় এবং এটি সম্প্রতি আরও অনেক ভালভাবে আয় করেছে (সম্ভবত আপনি সেরা সেরা হিসাবে রাতের সংস্করণ চেষ্টা করুন)।
(এটি কঠোরভাবে প্রশ্নের উত্তর দেয় না, তবে লোকেরা এটি পছন্দ করতে পারে)।
আমার মনে হয় একক বৃহত্তম পার্থক্য হ'ল এটি একটি বৈধ সি উত্স ফাইল:
int main()
{
foo();
}
নোট করুন যে আমি ঘোষণা করিনি foo
কোথাও ।
ভাষার পার্থক্য বাদে, সি ++ লাইব্রেরিতে এটি কিছু পরিবর্তন করে যা এটি সি থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়, যেমন কিছু ফাংশন const char *
পরিবর্তে ফিরে আসে char *
।
s,C,C89,
এবং নোট করা উচিত যে এটি একটি অবৈধ C99 উত্স ফাইল।
#include <stdio.h>
int new (int n) {
return n/2;
}
int main(void) {
printf("%d\n", new(10));
return 0;
}
আরও দেখুন সি ++ প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী এন্ট্রি ।
এখানে বেশিরভাগ উত্তরের বাক্য সংশ্লেষের পার্থক্য রয়েছে যা সি ++ সংকলকগুলিকে সি 98 (বা সি 99) উত্স কোডে ব্যর্থ হতে পারে। তবে কিছু সূক্ষ্ম ভাষার পার্থক্য রয়েছে যা উভয় ভাষায়ই বৈধ তবে এটি বিভিন্ন আচরণের জন্ম দিতে পারে। sizeof (char)
পার্থক্য হচ্ছে নবীন উল্লিখিত একটি উদাহরণ, কিন্তু একটি প্রোগ্রাম যা প্রিন্ট হবে "সি" যদি কোনো (ANSI) সি প্রোগ্রাম হিসাবে কম্পাইল, এবং "সি ++" যদি কোন সি ++ প্রোগ্রাম হিসাবে কম্পাইল লিখুন কিছু অন্যদের তালিকা।
সি সংকলকগণ সাধারণত একটি সাধারণ কোণে কাটা মঞ্জুরি দেয় যা সি ++ দেয় না। সি ++ সি এর চেয়ে অনেক বেশি কঠোর এবং সাধারণত, এর মধ্যে কয়েকটি পার্থক্য সংকলক-নির্ভর। g ++ এমন কিছু জিনিসকে মঞ্জুরি দেয় যা উদাহরণস্বরূপ ইন্টেল সি ++ সংকলকটি করে না। এমনকি বেশ ভাল লেখা সি কোড একটি আধুনিক সি ++ সংকলক দিয়ে সংকলন করবে না।
আপনি কেবল বাক্য গঠন দ্বারা ভাষার তুলনা করতে পারবেন না। আপনি যদি এটি করেন তবে আপনি সি ++ এর উপসেট হিসাবে দেখতে পাবেন। আমার মতে সি ++ ওও (এবং সি নয়) এই সত্যটি যথেষ্ট যে সি এবং সি ++ বিভিন্ন ভাষা।