ইনডেন্টিং


99

আমি জানি যে #define, ইত্যাদি সাধারণত কখনই অভিযুক্ত হয় না। কেন?

আমি এই মুহুর্তে কিছু কোডে কাজ করছি যার মধ্যে #defineএস, #ifdefএস, #elseএস, #endifএস ইত্যাদির একটি ভয়াবহ মিশ্রণ রয়েছে যা এগুলি প্রায়শই সাধারণ সি কোডের সাথে মিশ্রিত হয়। #defineএস -এর নন-ইনডেন্টিং তাদের পড়া শক্ত করে তোলে। এবং নন-ইনডেন্টেড #defineএর সাথে ইনডেন্ট কোডের মিশ্রণ একটি দুঃস্বপ্ন।

ইন্ডেন্টিং না করে কী লাভ #define? আমি যদি এগুলি যুক্ত করি তবে এটি কি আমাকে খারাপ ব্যক্তি করে তোলে? এই খুব ভাল না?

#ifdef SDCC
    #if DEBUGGING == 1
        #if defined (pic18f2480)
            #define FLASH_MEMORY_END 0x3DC0
        #elif defined (pic18f2580)
            #define FLASH_MEMORY_END 0x7DC0
        #else
            #error "Can't set  up flash memory end!"
        #endif
    #else
        #if defined (pic18f2480)
            #define FLASH_MEMORY_END 0x4000
        #elif defined (pic18f2580)
            #define FLASH_MEMORY_END 0x8000
        #else
            #error "Can't set  up flash memory end!"
        #endif
    #endif
#else
    #if DEBUGGING == 1
        #define FLASH_MEMORY_END 0x7DC0
    #else
        #define FLASH_MEMORY_END 0x8000
    #endif
#endif

উত্তর:


103

প্রাক-এএনএসআই সি প্রিপ্রসেসর একটি লাইনের শুরু এবং "#" অক্ষরের মধ্যে স্থানের অনুমতি দেয় না; শীর্ষস্থানীয় "#" সর্বদা প্রথম কলামে রাখতে হবে।

প্রাক-এএনএসআই সি সংকলকগুলি আজকাল অস্তিত্বহীন। আপনার পছন্দ মতো কোন স্টাইল ("#" এর আগে বা "#" এবং শনাক্তকারীর মধ্যে স্থান) ব্যবহার করুন।

http://www.delorie.com/gnu/docs/gcc/cpp_48.html


26

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

#ifdef SDCC
#  if DEBUGGING == 1
#    if defined (pic18f2480)
#      define FLASH_MEMORY_END 0x3DC0
#    elif defined (pic18f2580)
#      define FLASH_MEMORY_END 0x7DC0
#    else
#      error "Can't set  up flash memory end!"
#    endif
#  else
#    if defined (pic18f2480)
#      define FLASH_MEMORY_END 0x4000
#    elif defined (pic18f2580)
#      define FLASH_MEMORY_END 0x8000
#    else
#      error "Can't set  up flash memory end!"
#    endif
#  endif
#else
#  if DEBUGGING == 1
#    define FLASH_MEMORY_END 0x7DC0
#  else
#    define FLASH_MEMORY_END 0x8000
#  endif
#endif

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


16

প্রিপ্রসেসর নির্দেশিকাগুলি বিশ্লেষণ সম্পর্কে, সি 99 স্ট্যান্ডার্ড (এবং এর আগে সি 89 স্ট্যান্ডার্ড) সংকলক দ্বারা যৌক্তিকভাবে পরিচালিত ক্রিয়াকলাপ সম্পর্কে পরিষ্কার ছিল। বিশেষত, আমি বিশ্বাস করি যে এর অর্থ এই কোড:

/* */ # /* */ include /* */ <stdio.h> /* */

সমান:

#include <stdio.h>

আরও ভাল বা খারাপের জন্য, '-std = c89 -pedantic' সহ জিসিসি ৩.৪.৪ কোনও হারে মন্তব্য-বোঝা লাইনটি গ্রহণ করে। আমি এটিকে স্টাইল হিসাবে সমর্থন করছি না - এক সেকেন্ডের জন্য নয় (এটি অত্যন্ত ভয়ানক)। আমি কেবল মনে করি এটি সম্ভব।

আইএসও / আইইসি 9899: 1999 বিভাগ 5.1.1.2 অনুবাদ পর্বগুলি বলেছেন:

  1. [ট্রিগ্রফ সহ ক্যারেক্টার ম্যাপিং]

  2. [রেখা বিভক্তকরণ - ব্যাকস্ল্যাশ নিউলাইন সরানো]

  3. উত্স ফাইলটি প্রাক-প্রসেসিং টোকেন এবং শ্বেত-স্থানের অক্ষরের ক্রম (মন্তব্য সহ )গুলিতে বিভক্ত। একটি উত্স ফাইল আংশিক প্রাকপ্রসেসিং টোকেন বা আংশিক মন্তব্যে শেষ হবে না। প্রতিটি মন্তব্য একটি স্থান অক্ষর দ্বারা প্রতিস্থাপিত হয়। নতুন-লাইন অক্ষরগুলি ধরে রাখা হয়। নতুন-রেখা ব্যতীত সাদা-স্পেস অক্ষরের প্রতিটি নোম্পটি ক্রমটি কোনও স্থান অক্ষর দ্বারা বজায় রাখা বা প্রতিস্থাপন করা হয় তা বাস্তবায়ন-সংজ্ঞায়িত।

  4. পূর্ববর্তী নির্দেশাবলী কার্যকর করা হয়, ম্যাক্রো অনুরোধ প্রসারিত হয়, [...]

বিভাগ 6.10 পূর্ববর্তী নির্দেশাবলী বলে:

একটি প্রিপ্রোসেসিং নির্দেশিকা প্রিপ্রোসেসিং টোকেনগুলির ক্রম নিয়ে গঠিত যা একটি # প্রিপ্রোসেসিং টোকেন দিয়ে শুরু হয় (অনুবাদ পর্ব 4 এর শুরুতে) হয় সোর্স ফাইলে প্রথম অক্ষর (বিকল্পে সাদা স্থানের পরে কোনও নতুন-রেখার অক্ষর নেই) বা এটি কমপক্ষে একটি নতুন-লাইনের অক্ষরযুক্ত সাদা স্থান অনুসরণ করে এবং পরবর্তী নতুন-লাইন অক্ষর দ্বারা শেষ হবে।

একমাত্র সম্ভাব্য বিবাদ হল প্যারেন্টেটিক্যাল এক্সপ্রেশন '(অনুবাদ পর্ব 4 এর শুরুতে)', যার অর্থ এই হতে পারে যে হ্যাশের আগে মন্তব্যগুলি অনুপস্থিত থাকতে হবে যেহেতু চতুর্থ পর্বের শেষ অবধি তারা অন্যথায় ফাঁকা স্থান পরিবর্তন করে না।

যেমনটি অন্যরা উল্লেখ করেছেন যে প্রাক-মান সি প্রিপ্রসেসরগুলি বিভিন্ন উপায়ে অভিন্ন আচরণ করে নি এবং প্রিপ্রসেসর নির্দেশিকাগুলির আগে এবং আগে ফাঁকা স্থানগুলি এমন এক জায়গাগুলির মধ্যে ছিল যেখানে বিভিন্ন সংস্থাপক পৃথক কাজ করেছিল যার মধ্যে পূর্ববর্তী স্থানগুলির সাথে প্রিপ্রোসেসর নির্দেশকে স্বীকৃতি প্রদান করা ছিল না including ।

এটি লক্ষণীয় যে মন্তব্যগুলি বিশ্লেষণ করার আগে ব্যাকস্ল্যাশ-নিউলাইন অপসারণ ঘটে। ফলস্বরূপ, আপনার //ব্যাকস্ল্যাশ দিয়ে মন্তব্যগুলি শেষ করা উচিত নয় ।


7

আমি জানি না কেন এটি বেশি সাধারণ হয় না। কিছু সময় অবশ্যই আছে যখন আমি প্রিপ্রসেসর নির্দেশিকা যুক্ত করতে চাই।

একটি জিনিস যা আমার পথে চলতে থাকে (এবং মাঝে মাঝে চেষ্টা চালিয়ে যাওয়া বন্ধ করে দেয়) তা হ'ল অনেক বা সর্বাধিক সম্পাদক / আইডিই সামান্য উস্কানির সময়ে নির্দেশটি কলাম 1 এ ছুঁড়ে মারবে। যা জাহান্নাম হিসাবে বিরক্তিকর।


5

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

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

#if COND1
void foo() {
  #if COND2
  int i;
    #if COND3
  i = someFunction()
  cout << i << eol;
    #endif
  #endif
}
#endif

14
এই কোডটি অদ্ভুত বলে মনে হচ্ছে কারণ আপনি ইনডেন্টেশনের দুটি "স্ট্রিম" তৈরি করেছেন। আমি লাইনটি আরও 4 স্তরের ইন্ডেন্ট করব এবং আমি আরও দুটি স্তরের দ্বারা 6 এবং 7 লাইন যুক্ত করব।
কেভিন লাইটি

4
সম্পূর্ণ একমত. আমি মাঝে মাঝে এমনকি ধনুর্বন্ধনীও রেখেছি যাতে # যদি দেখতে এর মতো হয় তবে।
baash05

4
আমি আমার কোডটি সাজানোর জন্য খুব চেষ্টা করি যাতে আমার আসল কোডগুলি যে অংশে থাকে তার কোনও #ifdef লাইন না থাকে। পরিবর্তে, আমার যদি শর্তযুক্ত জিনিসগুলির প্রয়োজন হয় আমি তা হয় ফ্যাক্টর আউট ফাংশনগুলিতে রেখেছি বা ম্যাক্রোকে ফ্যাক্টর আউট করেছি; এটি আমি যেভাবে দেখতে পাই তা আরও পরিষ্কার (ভাল, কমপক্ষে এটি আমার কাছে)। আদর্শভাবে, সেই সমস্ত অংশযুক্ত অংশগুলি অন্য ফাইলগুলিতে থাকবে (শিরোনাম বা শর্তসাপেক্ষিত সংকলিত উত্স ফাইলসমূহ; কোডটি কী প্ল্যাটফর্মটি তৈরি হচ্ছে তা স্বাভাবিক "শর্ত")।
ডোনাল ফেলো

4
আমি লাইনগুলিকে 4 এক স্তরের এবং 6 এবং 7 দুটি স্তরের লাইন যুক্ত করব।
রকেটম্যাগনেট

3

উদাহরণস্বরূপ, আপনি যা দিয়েছেন তা স্পষ্ট করে তুলতে ইন্ডেন্টেশন ব্যবহার করা উপযুক্ত হতে পারে, কারণ আপনার যেমন নেস্টেড নির্দেশের জটিল কাঠামো রয়েছে।

ব্যক্তিগতভাবে আমি মনে করি এগুলি বেশিরভাগ সময় ইন্ডিটেড না রাখাই দরকারী, কারণ এই নির্দেশাবলী আপনার বাকী কোড থেকে আলাদাভাবে কাজ করে operate যেমন #ifdef, প্রাক প্রসেসর দ্বারা পরিচালিত হওয়ার আগে কম্পাইলার কি কখনো আপনার কোড দেখেন তাই একটি #ifdef নির্দেশ পর কোড একটি ব্লক এমনকি হতে পারে না ডিরেক্টিভ কম্পাইল

আপনার কোডের বাকী অংশ থেকে নির্দেশাবলী দৃশ্যত পৃথক করে রাখা আরও গুরুত্বপূর্ণ যখন এগুলি কোডের সাথে ছেদ করা হয় (পরিবর্তে আপনি যেমন উদাহরণ হিসাবে দেন তেমন কোনও নিবেদিত নির্দেশিকার ব্লক)।


4
আইপি এর দৃষ্টিকোণ থেকে, সংকলিত নয় এমন কিছু এবং একটি জ্যাম্পের কারণে পৌঁছানো হয়নি এমন কোনও কিছুর মধ্যে পার্থক্য কী।
baash05

2

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

একটি সাধারণ সমাধান হ'ল নির্দেশকে মন্তব্য করা, যাতে সহজেই তারা জানতে পারে যে তারা কী উল্লেখ করে:

#ifdef FOO
/* a lot of code */
#endif /* FOO */

#ifndef FOO
/* a lot of code */
#endif /* not FOO */

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

2

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


4
শালীন উত্তর। আপনি কিছু নির্দিষ্ট স্টাইল গাইড রেফারেন্স যুক্ত করে এটি উন্নত করতে পারেন?
ইথারড্রাগন

0

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

আপনি যদি # প্রাগমা এক্সপ্রেশন যুক্ত করতে চান তবে আপনি এটি নীচে সক্ষম করতে পারবেন: সরঞ্জামসমূহ> বিকল্পসমূহ> পাঠ্য সম্পাদক> সি / সি ++> ফর্ম্যাটিং> ইন্ডেন্টেশন> প্রিপ্রোসেসর নির্দেশিকাদের অবস্থান> ইন্ডেন্টড ছেড়ে দিন

কেবলমাত্র সমস্যাটি হ'ল স্বয়ংক্রিয় কোড লেআউটটি সেই বিন্যাসটি স্থির করেছে = (

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