জিসিসি / জি ++ সংকলকটিতে -পেনডেন্টিক ব্যবহারের উদ্দেশ্য কী?


136

এই নোটটি বলে:

-ansi: সংকলককে এএনএসআই ভাষা বিকল্পটি প্রয়োগ করতে বলে। এটি জিসিসির কিছু "বৈশিষ্ট্য" বন্ধ করে দেয় যা এএনএসআই মানের সাথে সঙ্গতিপূর্ণ নয়।

-pedantic: এর সাথে একত্রে ব্যবহৃত -ansi, এটি সংকলককে এএনএসআই মানক হিসাবে কঠোরভাবে মেনে চলতে বলে, যে কোনও কোড মান্য নয় তা প্রত্যাখ্যান করে।

আগেরটা আগে:

  • জিসিসি / জি ++ সংকলকটির বিকল্পগুলি -pedanticএবং -ansiবিকল্পগুলির উদ্দেশ্য কী (আমি উপরের বিবরণটি বুঝতে পারি না)?
  • এই দুটি বিকল্প ব্যবহার করার জন্য কেউ আমাকে সঠিক পরিস্থিতি বলতে পারেন?
  • আমি কখন তাদের ব্যবহার করব?
  • তারা গুরুত্বপূর্ণ?

উত্তর:


84

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


3
আইএসও সি এবং সি ++ স্ট্যান্ডার্ডগুলি কেবল "এক্সটেনশানগুলি নিষিদ্ধ করে" যাতে এক্সটেনশানটি কোনও মেনে চলার প্রোগ্রামের আচরণ পরিবর্তন করে না। সংকলক এক্সটেনশন ব্যবহার করে এমন কোনও প্রোগ্রাম প্রত্যাখ্যান করতে বাধ্য হয় না।
এমএম

@ এমএম: এটি লক্ষ্য করা গুরুত্বপূর্ণ যে যখন কিছু সংকলক একটি দরকারী নির্মাণকে গ্রহণ করবে এবং অন্যরা তা প্রত্যাখ্যান করবে তখন কমিটির "সমঝোতা" মেনে চলতে হবে এমন একটি ডায়াগনস্টিককে অবশ্যই প্রোগ্রামাররা অগ্রাহ্য করতে হবে যা কমিটির প্রয়োজনীয়তা এড়িয়ে চলবে ম্যান্ডেট হয় বা নির্মাণ নিষিদ্ধ।
সুপারক্যাট

105

আমি আমার কোডিংয়ে সর্বদা এটি ব্যবহার করি।

-ansiপতাকা সমতূল্য -std=c89। যেমন উল্লেখ করা হয়েছে, এটি জিসিসির কিছু এক্সটেনশন বন্ধ করে দেয়। যোগ করা -pedanticআরও এক্সটেনশান বন্ধ করে দেয় এবং আরও সতর্কতা উত্পন্ন করে। উদাহরণস্বরূপ, যদি আপনার স্ট্রিংটি 509 অক্ষরের চেয়ে বেশি দীর্ঘ হয় তবে -pedanticএটি সম্পর্কে সতর্ক করে কারণ এটি C89 স্ট্যান্ডার্ড দ্বারা প্রয়োজনীয় ন্যূনতম সীমা অতিক্রম করে। এটি হ'ল, প্রতিটি সি 89 সংকলক অবশ্যই 509 দৈর্ঘ্যের স্ট্রিং গ্রহণ করবে; তাদের দীর্ঘতর গ্রহণের অনুমতি দেওয়া হয় তবে আপনি যদি পেডেন্টিক হন তবে দীর্ঘতর স্ট্রিং ব্যবহার করা পোর্টেবল নয়, যদিও কোনও সংকলককে দীর্ঘতর স্ট্রিং গ্রহণ করার অনুমতি দেওয়া হয় এবং পেডেন্টিক সতর্কতা ছাড়াই, জিসিসি সেগুলিও গ্রহণ করবে।


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

4
@ হুয়াহসিন 68: ভাল, কম বা কম। এমএসভিসি হ'ল বেশিরভাগের থেকে পৃথক পৃথক সংকলক, এর নির্দিষ্ট বাস্তুতন্ত্রের সাথে আরও খাপ খাইয়ে নেওয়া হয় এবং এর বাইরে পাওয়া যায় না। এটি অনেকগুলি নিজস্ব উপায়ে করে - যা স্ট্যান্ডার্ডের মতো নয়। তবুও, আপনি যদি মানক শিরোলেখ ইত্যাদির সাথে থাকেন তবে এমএসভিসি এবং জিসিসি মোটামুটি একই রকম। তবে, ব্যবহারের -std=c89 -pedanticঅর্থ এই নয় যে আপনি অন্যান্য প্ল্যাটফর্মের বিভিন্ন সংকলকগুলির মধ্যে আরও সহজে চলে যেতে পারেন। আপনি ব্যবহার শুরু করার <windows.h>সাথে সাথেই অন্যান্য সিস্টেমের সাথে সামঞ্জস্যতা সমস্যাযুক্ত হয়ে ওঠে।
জোনাথন লেফলার

2
@ এসএলএফ: যেহেতু অন্যান্য বিক্রেতার মতো (যদিও জিএনইউ তাদের সংকলক নগদ হিসাবে বিক্রি করে না), তারা কি তাদের মালিকানা বৈশিষ্ট্যগুলি ব্যবহার করতে চাইবে? বা, আরও সাধারণভাবে, কারণ তারা এক্সটেনশানগুলি দরকারী বলে মনে করে এবং এগুলি ডিফল্টরূপে সক্ষম করা উচিত বলে মনে করে।
জোনাথন লেফলার

1
যাই হোক না কেন জন্য এটা মূল্য, এবং JFTR , আমি বেশিরভাগ ব্যবহার বন্ধ করে থাকেন -pedantic, কিন্তু আমার কোডের বেশীর ভাগ লোক এখনও ঠিক আছে প্রনয়ন যখন আমি (এক প্রোগ্রাম যা স্পষ্টভাবে ব্যবহার করছিলেন করা হয়নি পুনরায় সক্রিয় __int128ধরনের, যা হয় নীতিবাগীশীদের মতো ভুল)। আমি মনে করি যে একটি মধ্যস্থতাকারী মঞ্চ ছিল যখন জিসিসি খুব শোরগোল করে (আমার পছন্দ অনুসারে) ছিল -pedantic। আমি স্রেফ প্রায় 300 উত্সর ফাইলগুলি পরীক্ষা করেছি - কিছু লাইব্রেরি কোড, কিছু আদেশ, কিছু এসও পরীক্ষা প্রোগ্রাম - এবং কেবলমাত্র প্রত্যাশিত সমস্যা ছিল। বর্তমানে ম্যাক ওএস এক্স ১০.৯.২-এ জিসিসি 4.8.2 ব্যবহার করছে।
জোনাথন লেফলার

1
@ জোনাথনলফলার, হ্যাঁ, আমি জিজ্ঞাসা করছি বাস্তবে প্রকৃত সংকলকের নামটি কোথায় কাজ করবে না? এমন কি একটি সংকলক আছে?
পেসেরিয়র

23

-ansiএটি একটি অপ্রচলিত সুইচ যা সি স্ট্যান্ডার্ড , আইএসও / আইসিসি 9899: 1990 -এর 30-বছরের পুরানো অপ্রচলিত সংশোধন অনুসারে সংকলককে অনুরোধ করার অনুরোধ করে যা মূলত এএনএসআই স্ট্যান্ডার্ড X3.159-1989 "প্রোগ্রামিং ল্যাঙ্গুয়েজ সি'র পুনর্নির্মাণ । অপ্রচলিত কেন? কারণ সি 90 আইএসও প্রকাশিত হওয়ার পরে আইএসও সি মানদণ্ডের দায়িত্বে ছিল এবং সি 90-তে যে কোনও প্রযুক্তিগত সংকলন আইএসও প্রকাশ করেছে। সুতরাং এটি ব্যবহার করা আরও উপযুক্ত -std=c90

এই স্যুইচটি ছাড়াই, সাম্প্রতিক জিসিসি সি সংকলকগুলি আইএসও / আইসিসি 9899: 2011 বা নতুন 2018 সংশোধনীতে মানিকৃত সি ভাষার সাথে খাপ খায়

দুর্ভাগ্যক্রমে কিছু অলস সংকলক বিক্রেতারা আছেন যারা বিশ্বাস করেন যে এটি কোনও পুরানো অপ্রচলিত স্ট্যান্ডার্ড রিভিশনকে আটকে রাখা গ্রহণযোগ্য which

স্যুইচটি ব্যবহার করা এই কোডগুলি এই অপ্রচলিত সংকলকগুলিতে সংকলন করা উচিত তা নিশ্চিত করতে সহায়তা করে।


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

struct test {
    int zero_size_array[0];
};

C11 খসড়া n1570 অনুচ্ছেদ 6.7.6.2p1 বলেছেন :

Typeচ্ছিক প্রকারের যোগ্যতা এবং কীওয়ার্ড স্ট্যাটিক ছাড়াও [এবং] একটি এক্সপ্রেশন বা * সীমিত করতে পারে। যদি তারা একটি অভিব্যক্তি সীমিত করে (যা একটি অ্যারের আকার নির্দিষ্ট করে), এক্সপ্রেশনটির একটি পূর্ণসংখ্যার প্রকার থাকবে। যদি অভিব্যক্তিটি একটি ধ্রুবক অভিব্যক্তি হয় তবে এর মান শূন্যের চেয়ে বড় হবে। [...]

সি স্ট্যান্ডার্ডের জন্য অ্যারের দৈর্ঘ্য শূন্যের চেয়ে বেশি হওয়া দরকার; এবং এই অনুচ্ছেদটি সীমাবদ্ধতার মধ্যে রয়েছে ; মানটি নিম্নলিখিত 5.1.1.3p1 বলছে :

যদি একটি প্রিপ্রোসেসিং অনুবাদ ইউনিট বা অনুবাদ ইউনিটে কোনও সিনট্যাক্স নিয়ম বা সীমাবদ্ধতার লঙ্ঘন থাকে তবে একটি আচরণ যথাযথভাবে সংজ্ঞায়িত বা বাস্তবায়ন হিসাবেও নির্দিষ্ট করে দেওয়া হলেও একটি বাস্তবায়ন বাস্তবায়ন কমপক্ষে একটি ডায়গনিস্টিক বার্তা উত্পন্ন করবে (বাস্তবায়ন-সংজ্ঞায়িত পদ্ধতিতে চিহ্নিত)) সংজ্ঞায়িত। অন্যান্য পরিস্থিতিতে ডায়াগনস্টিক বার্তাগুলি তৈরি করা দরকার নয়))

তবে আপনি যদি প্রোগ্রামটি সংকলন করেন তবে gcc -c -std=c90 pedantic_test.cকোনও সতর্কতা উত্পন্ন হয় না।

-pedanticসংকলক আসলে সি স্ট্যান্ডার্ড মেনে চলতে কারণ ; সুতরাং এখন এটি একটি ডায়গনিস্টিক বার্তা তৈরি করবে, যেমনটি স্ট্যান্ডার্ডের দ্বারা প্রয়োজনীয়:

gcc -c -pedantic -std=c90 pedantic_test.c
pedantic_test.c:2:9: warning: ISO C forbids zero-size array zero_size_array [-Wpedantic]
     int zero_size_array[0];
         ^~~~~~~~~~~~~~~

সুতরাং সর্বাধিক বহনযোগ্যতার জন্য, স্ট্যান্ডার্ড রিভিশনটি উল্লেখ করা যথেষ্ট নয়, আপনাকে অবশ্যই -pedantic(বা -pedantic-errors) অবশ্যই নিশ্চিত করতে হবে যে জিসিসি আসলে স্ট্যান্ডার্ডের অক্ষরকে মেনে চলে।


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


4
নোট করুন যে ভাষা মানের আরও সংশোধন হয়েছে। আজ আমি সাধারণত সঙ্গে সংকলন -std=c11 -Wall -Wextra -Wpedantic -Wconversion
ডেভিস্লোর

14

মূলত, এটি অন্যান্য কোডারগুলি যা এএনএসআই মানকে বাস্তবায়িত করে এবং অন্যান্য অপারেটিং সিস্টেম / প্ল্যাটফর্মের অধীনে কোন লাইব্রেরি / এপিআই আপনাকে কল করে তা আপনি যদি যত্নবান হন তবে আপনার কোডটি আরও সহজ করে তুলবে অন্যান্য সংকলকগুলির অধীনে আপনার কোডটি easier

প্রথমটি, জিসিসির বিশেষ বৈশিষ্ট্যগুলি বন্ধ করে। (-আনসি) দ্বিতীয়টি, মানদণ্ডের সাথে মান্য করে না এমন কোনও কিছুই সম্পর্কে অভিযোগ করবে (কেবলমাত্র জিসিসির নির্দিষ্ট বৈশিষ্ট্যগুলি নয়, তবে আপনার গঠনগুলিও।) (-পেনডিক)।


6

যদি আপনার কোডটি পোর্টেবল করার প্রয়োজন হয় তবে আপনি এটি পরীক্ষা করতে পারেন যে এটি কোনও জিসিসি এক্সটেনশন বা অন্যান্য মানহীন বৈশিষ্ট্য ছাড়াই সংকলন করে। যদি আপনার কোডটি -pedantic -ansiতত্ত্বের সাথে সংকলিত হয় তবে এটি অন্য কোনও এএনএসআই মানক সংকলক সহ ঠিকঠাক করা উচিত।


4
-pedanticসমস্ত এক্সটেনশান বন্ধ করে না, এটি ডাবল-আন্ডারস্কোর স্টাফগুলির একটি গোছায় ছেড়ে যায়। সুতরাং এটি আরও সঠিক হতে পারে যে আপনার কোডটি যদি সংকলিত হয় -pedantic -ansiএবং এটি অন্যান্য বাস্তবায়নের ক্ষেত্রে সংকলিত হতে পারে এমনভাবেও এটি নির্মমভাবে দেখায় তবে এটি সংকলন করবে।
স্টিভ জেসোপ

3
আপনি ডাবল-আন্ডারস্কোর স্টাফ উল্লেখ করেছেন, এই শব্দটি আকর্ষণীয়। আপনি ঠিক কি উল্লেখ করছি?
huahsin68

একটি উদাহরণ জিসিসির "__asm ​​__ ()" ইনলাইন এসেম্বলি কোড যা জিসিসির পক্ষে ঠিক আছে তবে সেই দ্বিগুণ আন্ডারস্কোর জিনিসটি উইন্ডোজ সংকলক বলে কাজ করতে পারে না, এমনকি যদি সেই সংকলক মানটি মেনে চলে না।

3

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


2
জিসিসির কয়েকটি সংস্করণে!
মোহাম্মদ আমজাদ LASRI

1

অন্যরা যথেষ্ট উত্তর দিয়েছেন। আমি ঘন ঘন এক্সটেনশনের কয়েকটি উদাহরণ যুক্ত করতে চাই:

mainফাংশন ফিরে void। এটি স্ট্যান্ডার্ড দ্বারা সংজ্ঞায়িত করা হয়নি, এর অর্থ এটি কেবলমাত্র কয়েকটি সংকলক (জিসিসি সহ) ব্যবহার করবে, তবে অন্যের জন্য নয়। যাইহোক, int main()এবংint main(int, char**) দুটি স্বাক্ষর যা মানকে সংজ্ঞায়িত করে।

অন্য একটি জনপ্রিয় এক্সটেনশন অন্যান্য ফাংশনগুলির মধ্যে ফাংশনগুলি ডিক্লেয়ার এবং সংজ্ঞায়িত করতে সক্ষম হচ্ছে:

void f()
{
    void g()
    {
       // ...
    }

    // ...
    g();
    // ...
}

এটা মানহীন। আপনি যদি এই জাতীয় আচরণ চান তবে সি ++ 11 ল্যাম্বডাস পরীক্ষা করে দেখুন


0

পেডেন্টিক এটি তৈরি করে যাতে সিসিপি সংকলক সমস্ত জিএনইউ সি এক্সটেনশানকে কেবল এএনএসআই সামঞ্জস্যপূর্ণ করে না তা প্রত্যাখ্যান করে।


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