সবচেয়ে খারাপ বাস্তব-বিশ্বের ম্যাক্রো / প্রাক-প্রসেসরের অপব্যবহারটি আপনি কখনই পেরেছেন?


176

সবচেয়ে খারাপ কি আপনি কখনও এসেছেন রিয়েল-ওয়ার্ল্ড ম্যাক্রোস / প্রাক-প্রসেসরের অপব্যবহারটি কী (দয়া করে কোনও অনুমোদিত আইওসিসি উত্তর নেই * হাহা *)?

এটি যদি বিনোদনমূলক হয় তবে দয়া করে একটি সংক্ষিপ্ত স্নিপেট বা গল্প যুক্ত করুন। লক্ষ্য হ'ল লোকদের "ম্যাক্রো কখনই ব্যবহার করবেন না" বলার পরিবর্তে কিছু শেখানো।


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


বোনাস: একটি উদাহরণ দিন যেখানে ম্যাক্রো আসলে ম্যাক্রো নয় এমন সমাধানের চেয়ে ভাল ছিল।

সম্পর্কিত প্রশ্ন: সি ++ ম্যাক্রো কখন উপকারী?


আমি ম্যাক্রোগুলের হাতে যে ধরণের অপব্যবহার চালিয়েছি সেদিকে দৃষ্টি আকর্ষণ করার জন্য +1।
i_am_jorf

37
# সত্য সত্য মিথ্যা // হ্যাপি ডিবাগিং :)
n0rd

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

2
"লোকেরা সমস্ত আকৃতির আকৃতি থেকে বেরিয়ে এসে এটি বন্ধ করে দেবে": আপনি কি বোঝাচ্ছেন যে স্ট্যাকের ওভারফ্লোতে আপনি কোনও হাস্যকর / মজার সামগ্রী চান না?
ট্রেভর বয়েড স্মিথ

2
কেবলমাত্র একটি द्रुत বিন্দু, প্রাক-প্রসেসরটি ভাষার একটি অংশ এবং তাই অন্য কোনও কিছুর মতোই ব্যবহার করা খারাপ / ভুল নয়।
মিঃ বয়

উত্তর:


410

স্মৃতি থেকে, এটি এমন কিছু দেখায়:

#define RETURN(result) return (result);}

int myfunction1(args) {
    int x = 0;
    // do something
    RETURN(x)

int myfunction2(args) {
    int y = 0;
    // do something
    RETURN(y)

int myfunction3(args) {
    int z = 0;
    // do something
    RETURN(z)

হ্যাঁ এটি ঠিক, কোনও কার্যক্রমে কোনও বন্ধনী বন্ধনী নেই। সিনট্যাক্স হাইলাইট করা একটি জগাখিচুড়ি ছিল, তাই তিনি সম্পাদনা করতে vi ব্যবহার করেছিলেন (ভিম নয়, এতে সিনট্যাক্সের রঙ রয়েছে!)

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

তার সাথে দুটি আরও কৌতুহল ছিল: একটি নজরদারি আয়না তার মনিটরের উপরে মাউন্ট করা হয়েছিল "কে দেখছে তা জানার জন্য", এবং একটি দ্রুত দশটি পুশআপ করার জন্য তাঁর চেয়ার থেকে মাঝেমধ্যে হঠাৎ করে বেরিয়ে আসা। তিনি এই শেষটিকে ব্যাখ্যা করেছিলেন "সংকলক কোডে ত্রুটি পেয়েছে This এটি শাস্তি" "।


87
"সংকলক কোডে ত্রুটি পেয়েছে This এটি শাস্তি"। !! কোম্পানী আপনাকে পেয়েছে ... সহকর্মীদের শাস্তি!
শিখছি

227
সোভিয়েত রাশিয়ায়, প্রোগ্রাম আপনাকে সংকলন করে!
ক্র্যাশ ওয়ার্কস

53
আমি যখন সংকলনের ত্রুটি "শাস্তি" সম্পর্কে পড়ি, তখন প্রথম যে জিনিসটি আমি ভেবেছিলাম তা হ'ল "ডবিকে তার হাতগুলি ইস্ত্রি করতে হয়েছিল"।
গ্রীম পেরো

124
আমি মনে করি প্রোগ্রামাররা (আমার অন্তর্ভুক্ত) আরও উপযুক্ত হবে যদি আমরা সবাই প্রতিবার একটি সংকলক আমাদের কোডটিতে একটি ত্রুটি খুঁজে পেলাম 10 টি পুশআপ করতাম। এটি সংকলন দ্বারা পরীক্ষার ঘটনাও হ্রাস করতে পারে।
মাইকিবি

5
লোকটি দুর্দান্ত লাগছে। তবে হ্যাঁ, আমি দেখতে পাচ্ছি না যে এটি কীভাবে কোডের আকারের উন্নতি করবে।
জলফ

274

আমার সবচেয়ে খারাপ:

#define InterlockedIncrement(x) (x)++
#define InterlockedDecrement(x) (x)--

আমি আমার জীবনের দু'দিন কাটিয়েছি কিছু মাল্টি-থ্রেডড সিওএম রেফ-কাউন্টিং ইস্যু সন্ধান করতে কারণ কিছু বোকা এটিকে একটি শিরোনাম ফাইলে রেখে দেয়। আমি সেই সময়ে যে সংস্থার জন্য কাজ করেছি তার উল্লেখ করব না।

এই গল্পের নৈতিকতা? আপনি যদি কিছু বুঝতে না পারেন তবে ডকুমেন্টেশনটি পড়ুন এবং সে সম্পর্কে শিখুন। শুধু এটি দূরে যেতে না।


146
@ জোশুয়া: আপনি যদি এই কোডটি একটি বহুবিধ পরিবেশে চালান, আপনি সম্ভবত অজান্তেই এটি করতে পারেন
1800 তথ্য

11
"আপনি যদি কিছু বুঝতে না পারেন, ডকুমেন্টেশনটি পড়ুন এবং এটি সম্পর্কে শিখুন just কেবল এটিকে দূরে সরিয়ে দেবেন না" " - আমেন!
পল আলেকজান্ডার

2
@ 1800 তথ্য: আমি মনে করি আপনি কেবল ভোট হারাবেন, যার কারণে আমি আপনাকে একটিও দিতে পারছি না; p
wkf

5
নন-সি ++ প্রোগ্রামার হিসাবে আমাকে ক্ষমা করুন: থ্রেডস্যাফ ফাংশনটি নন-থ্রেডসেফে রূপান্তরিত হওয়াই এখানে মূল সমস্যা? অথবা যে ইন্টারলকডইনক্রিমেন্টটি কোনও পয়েন্টার প্রত্যাশা করে, তাই এখন আপনি পয়েন্টারটি কী নির্দেশ করছেন তার পরিবর্তে এটি বাড়িয়ে দেবেন? অথবা উভয়?
টিম পিটজ্যাকার

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

166
#define ever (;;)
for ever { 
   ...
}

52
আমি পছন্দ <জন্য # define চিরতরে (;;)> যাতে আপনি লিখতে পারেন <চিরকাল {...}>
paxdiablo

আমি যে কেউ
এভারের জিনিসটির

6
প্যাকসের পরামর্শ কি সরাসরি কে ওআর থেকে পাওয়া যায় না? তবুও, চেষ্টা করার মতো নয়, আমি বলব।
জন এরিকসন

এটি আসলে মোটেই খারাপ নয়। আমি for (;;)আইডিয়াম ব্যবহার করছি না , অন্যথায় আমি তাত্ক্ষণিকভাবে আমার কোডটিতে এই ম্যাক্রো যুক্ত করব।
এএনটি

1
@ হাইয়ালসি: ইমাস লিস্পে (এবং কিছু সাধারণ লিস্প বাস্তবায়ন) আপনি করতে পারেন (defmacro ever ())এবং তারপরে(require 'cl (ever))
জো ডি

145
#include <iostream>
#define System S s;s
#define public
#define static
#define void int
#define main(x) main()
struct F{void println(char* s){std::cout << s << std::endl;}};
struct S{F out;};

public static void main(String[] args) {
  System.out.println("Hello World!");
}

চ্যালেঞ্জ: সংজ্ঞায়িত এবং সংজ্ঞা দিয়ে কেউ কি এটি করতে পারে? ;-)


19
আপনি কেবল একটি জাভা-টু-সি রূপান্তর লিখেছেন! horray!
আন্দ্রেয় পিটারসন

25
"আপত্তিকর" হিসাবে রিপোর্ট করা হয়েছে। (আমি ছাগল!)
আনিকা ব্যাকস্ট্রোম

40
এটি হয় গোপনে সুন্দর বা সুন্দরভাবে ঘৃণ্য।
ক্রিস লুটজ

38
@ মার্ক - এটি ঘোষিত publicএবং static as nothing, অকার্যকর` যেমন int, এবং main(x)হিসাবে main(), তে public static void main(String[] args)পরিণত হয় int main()। তারপর Systemমধ্যে সক্রিয় S s;s, তাই System.out.println("Hello World!");মধ্যে সক্রিয় S s; s.out.println("Hello World!");যা কল printlnফাংশন Fমধ্যে struct হয় Sstruct হয়।
ক্রিস লুটজ

2
এটি একবার দেখুন: mailcom.com/ioccc/chia/chia.c (এটি ডাউনলোড করুন এবং সংকলন করুন)
রবার্তো বনভোলেট

130
#define private public

আমি আগে এটি করেছি। কখনও কখনও আপনাকে কেবল সদস্য পরিবর্তনশীল পরিবর্তন করতে হবে বা কোনও তৃতীয় পক্ষের কোডে কোনও ফাংশন ওভাররাইড করতে হবে যা আপনি পরিবর্তন করতে পারবেন না - এবং তারা আপনার জন্য কোনও অ্যাক্সেসর সরবরাহ করে না।
মাইকেল ক্রিস্টোফিক

30
ইউনিট টেস্টিংয়ের জন্য বাহ এটি এমনকি কার্যকর হতে পারে, যদিও অবজেক্ট ডিজাইনের ভূতরা আপনাকে রাতে আক্রান্ত করবে।
এপাগা

12
হুম, সংজ্ঞায়িত আচরণ, এক-সংজ্ঞা নিয়মের সহজ লঙ্ঘন, সম্ভাব্য বিন্যাসের পার্থক্য। হ্যাঁ, এটি একটি বিজয়ী।
ডেভিড থর্নলে

10
সুতরাং এটির সাহায্যে আমি ব্যক্তিগত এবং পাবলিক স্টাফগুলিতে অ্যাক্সেস করতে পারি, তবে সুরক্ষিত স্টাফ রাখতে পারি না এবং আমি classকীওয়ার্ড এবং প্রথম অ্যাক্সেস মডিফায়ারের মধ্যবর্তী জিনিসগুলি অ্যাক্সেস করতে পারি না ।
কেন ব্লুম

3
@ কেন:#define class struct #define protected public
ইয়াকভ গালকা

107
#define if while

এটি কারওর উপর রসিকতা বাজানো হয়েছিল, এটি প্রভাবিতদের দ্বারা মজাদার নয়


22
# যদি আপনি আরও কৃপণ হয়ে ওঠেন তবে এটি নির্ধারণ করুন।
তারাব্লিউ

7
আমাদের আপনার বক্তব্য স্পষ্ট করা উচিত। এটা তোলে ক্রীড়া-কৌতুক পাওয়া যায়নি মানুষ আক্রান্ত দ্বারা । :-)
অ্যান্ড্রু শেফার্ড

6
আমি যখন হোমওয়ার্কের অ্যাসাইনমেন্টগুলি করি তখন আমি প্রায়শই আমার শিক্ষকদের বিরক্ত করার জন্য উদ্দেশ্য নিয়ে এই ধরণের কাজ করতাম।
পাইওন

15
এটি একটি ভাল প্রেনক তবে কোনও "অন্য" বিবৃতি থাকলে তা সংকলন করে না। আমি খুঁজে পেয়েছি যে # ডিফাইন যদি (এক্স) যদি (সত্য) সবচেয়ে কার্যকর হয়।
গ্রাফিক্স নুব

32
আমি সবসময় অগ্রাধিকার # define যাও sizeof (x) এর RAND ()
জন

106

ঘৃণ্য:

#define begin {
#define end }
/* and so on */

সিরিয়াসলি, আপনি যদি পাস্কলটিতে কোড করতে চান তবে একটি পাস্কাল সংকলক কিনুন, সুন্দর সি ভাষাটি ধ্বংস করবেন না।


45
এখন আপনি আমাকে ভাবছেন যে আমি কোন চতুর যথেষ্ট হেডার ফাইলের সাথে কোন ভাষাগুলি অনুকরণ করতে পারি।
বিলটি

47
সি সুন্দর নয়। এটা বরং কুরুচিপূর্ণ।
rlbond

27
এর সৌন্দর্য তার সরলতায় নিহিত। বলা হয়ে থাকে যে এটিতে অ্যাসেম্বলি ভাষার সমস্ত গতি রয়েছে ... সমাবেশ ভাষা :-) এর পাঠ্যতার সাথে মিলিয়ে আমি এটি স্ফীত সি ++ এর চেয়ে বেশি পছন্দ করি (যদিও আমি বিশাল দিনের গ্রন্থাগারের কারণে আমার দিনের চাকরিতে জাভা পছন্দ করি)।
paxdiablo

9
সত্যিই না. বোর্ন শেলটির জন্য বোর্নের আসল উত্স সন্ধান করুন। কিছুটা জারজ ALGOL- জাতীয় জগাখিচুড়ি পেতে তিনি ঠিক এই কাজটি করেছিলেন।
RBerteig

3
# অন্তর্নিহিত ডিও (ইন _ আই = 0; _ আই <= 1; ++ _ আই) {যদি (_আই == 1) //// লাইন BREAK //// # নির্ধারিত আইএফ (কনড); if (! (cond)) ব্রেক; } //// লাইন BREAK //// ডিও প্রিন্টফ ("এ") আইএফ (1 == 2);
অ্যাড্রিয়ান পানাসিয়ুক

93

একজন 'আর্কিটেক্ট', খুব নম্র লোক, আপনি জানেন যে টাইপটি ছিল:

#define retrun return

কারণ সে দ্রুত টাইপ করতে পছন্দ করে। মস্তিষ্ক-সার্জন তার চেয়ে স্মার্ট লোকদের (যারা বেশিরভাগই সবাই ছিলেন) চিৎকার করতে পছন্দ করতেন এবং তাদের উপর তার ব্ল্যাক-বেল্ট ব্যবহার করার হুমকি দিতেন।


আমি টাইপোটি এতটাই তৈরি করি যা আমি আসলে এটি বিবেচনা করেছি।
জোশুয়া

4
বরং আপনার সম্পাদককে পুনরায় বিনিময়ে পুনরায় প্রবেশ করতে শেখান। আমি আমার আইআরসি-ক্লায়েন্টকে এই জাতীয় হ্যাকারি করেছিলাম, কমপক্ষে
তিথা

1
আরে, আমার মনে হয় আমি সেই 'আর্কিটেক্ট' এর সাথেও কাজ করতাম। নিজের অহং প্রশমিত করার প্রয়োজনে তিনি অবশেষে সিনিয়র-আর্কিটেক্টের পুনরায় শ্রেণিবদ্ধ হন।
বিআইবিডি

1
আমি ব্যাশে 'আরএম' এর নতুন সংজ্ঞা দিয়েছিলাম, কারণ আমি টাইপ করতে পারিনি এবং 'আরএন' নিউজ রিডারটি শুরু করতে এবং সার্ভারের সাথে সংযোগ করতে 5 মিনিট সময় নিয়েছিল।
মার্টিন বেকেট

2
আপনি কেবল নতুন টার্মিনালটি খুলতে পারেন নি (বা অন্য কোনও ভিটিতে স্যুইচ করুন) এবং করবেন killall rn?
জো ডি

69

বাস্তব জগতে? MSVC এর minmax.h এ ম্যাক্রোগুলি রয়েছে, বলা হয় maxএবং minযা প্রতিটি সময় আমি স্ট্যান্ডার্ড std::numeric_limits<T>::max()ফাংশনটি ব্যবহার করার ইচ্ছে করে একটি সংকলক ত্রুটির সৃষ্টি করে ।


2
হ্যাঁ, হ্যাঁ, তাই এমএস-নির্দিষ্টগুলির পরে আমার # অপরিচিতদের পুনরুদ্ধার করার সাথে আমার একটি বিশেষ শিরোনাম ছিল ...
পন্টাস গ্যাজে

3
(Std :: numeric_limits <T> :: max) () দিয়ে সমাধান করা হয়েছে তবে হ্যাঁ, বেশ বিরক্তিকর।
rlbond

36
সি / সি ++ -> প্রাকপ্রসেসর -> প্রিপ্রসেসর সংজ্ঞা অনুসারে আপনার প্রকল্পের বৈশিষ্ট্যে NOMINMAX যুক্ত করুন।
mattnewport 1 ই

18
এই ম্যাক্রোগুলি সিএস + স্ট্যান্ডার্ড লাইব্রেরিতে ন্যূনতম এবং সর্বাধিক থেকে বেশি দীর্ঘকালীন এমএস হেডারগুলিতে বিদ্যমান রয়েছে।
রিচার্ড

4
এটি আরও খারাপ যখন আপনার চারটি বাহ্যিক নির্ভরতা কমপক্ষে / সর্বোচ্চ তাদের নিজস্ব স্তনের বিভিন্ন স্তরের সংজ্ঞা দেয়, খারাপভাবে প্যারেন্টসাইজড ম্যাক্রোগুলি থেকে শুরু করে ভাল-লিখিত টেম্পলেটগুলিতে থাকে এবং তাদের মধ্যে একটির পক্ষে কেবল অসম্ভবকে অসম্ভব করে দেওয়া হয় অথবা অন্যথায় এগুলি এড়িয়ে যান ... আমার বইয়ে যদিও ভাষা দোষের মতো 50%।
রোমান স্টারকভ 20

58

পাস্কাল সিনট্যাক্স এবং ফরাসি কীওয়ার্ডগুলির মধ্যে একটি মিশ্রণ:

#define debut {
#define fin }
#define si if(
#define alors ){
#define sinon }else{
#define finsi }

36
# নির্ধারিত zut_alors প্রস্থান (-1)
মাইকিবি

4
এটি দুর্দান্ত এবং এটি আমাকে উচ্চস্বরে হেসে তোলে। সুতরাং, এটি মূলত সিটিতে প্রয়োগ করা বেসিকের একটি স্থানীয় ফ্রেঞ্চ সংস্করণ?
ববি

56

ফ্লো কন্ট্রোল ম্যাক্রোগুলি ব্যবহারের বিরুদ্ধে রেমন্ড চেনের সত্যিই খুব ভাল বাচ্চা । তার সর্বোত্তম উদাহরণটি আসল বোর্ন শেল উত্স কোড থেকে সরাসরি:

ADDRESS alloc(nbytes)
    POS     nbytes;
{
    REG POS rbytes = round(nbytes+BYTESPERWORD,BYTESPERWORD);

    LOOP    INT     c=0;
    REG BLKPTR  p = blokp;
    REG BLKPTR  q;
    REP IF !busy(p)
        THEN    WHILE !busy(q = p->word) DO p->word = q->word OD
        IF ADR(q)-ADR(p) >= rbytes
        THEN    blokp = BLK(ADR(p)+rbytes);
            IF q > blokp
            THEN    blokp->word = p->word;
            FI
            p->word=BLK(Rcheat(blokp)|BUSY);
            return(ADR(p+1));
        FI
        FI
        q = p; p = BLK(Rcheat(p->word)&~BUSY);
    PER p>q ORF (c++)==0 DONE
    addblok(rbytes);
    POOL
}

2
দুটি পয়েন্ট: এক, এই পেস্টটি মূল উদ্বোধনকে বিশৃঙ্খল করে। এবং দুটি, কোডটি এটির জন্য দুর্দান্ত দেখাচ্ছে: 1970 এর দশকের ইউনিক্স সি একজন উত্সাহী অ্যালগল -68 ফ্যান দ্বারা। _যদি ভাগ্যবান দৃff়রা নিজেকে একটি উদ্দীপনাপূর্ণ স্টাইলে প্রকাশ করতে পারে তবে স্টিভ বোর্ন কেন পারেন না? অবশ্যই, কেউ এটিকে বজায় রাখার জন্য নিন্দা করেছেন যিনি আলগোল 68 জানেন না তারা নিজের পছন্দগুলি আরও প্রশস্ত করার এই সুযোগটির প্রশংসা করতে পারে না।
দারিয়াস বেকন

আমি মনে করি এটি প্রস্তাবিত প্রোগ্রামিং স্টাইলের চেয়ে স্টিভ বোর্নের রসিকতা হিসাবে চিহ্নিত করা যেতে পারে
মার্টিন বেকেট

2
আমি দেখেছি if... else... elif... fiএবং case... এর esacআগে (যে ভাষায় বোর্ন শি এর জন্য আবিষ্কার করেছিলেন), কিন্তু loop... poolএকটি বাস্তব রত্ন।
hobbs

54

আমি প্রতিযোগিতার জন্য বিশৃঙ্খলা-পিপি নামে একটি রত্ন জমা দিতে চাই , যা প্রিপ্রসেসর ম্যাক্রোগুলির মাধ্যমে একটি কার্যকরী ভাষা প্রয়োগ করে।

উদাহরণগুলির মধ্যে একটি হ'ল 500 তম ফিবোনাচি সংখ্যাটি সম্পূর্ণ প্রিপ্রোসেসর দ্বারা গণনা করা:

প্রিপ্রসেসরের আগে আসল কোডটি এটিকে দেখায়:

int main(void) {
   printf
     ("The 500th Fibonacci number is "
      ORDER_PP(8stringize(8to_lit(8fib(8nat(5,0,0)))))
      ".\n");
   return 0;
}

ফাইলটি প্রাক-প্রসেসিং করে আমরা নিম্নলিখিত ফলাফলটি পাই (বরং দীর্ঘ প্রতীক্ষার পরে):

$ cpp -I../inc fibonacci.c 2>/dev/null | tail
  return fib_iter(n, 0, 1);
}
# 63 "fibonacci.c"
int main(void) {
   printf
     ("The 500th Fibonacci number is "
      "139423224561697880139724382870407283950070256587697307264108962948325571622863290691557658876222521294125"
      ".\n");
   return 0;
}

1
আপনি সিভিএস থেকে কোডটি ধরতে পারেন এবং একবার দেখুন। কিছুক্ষণ আগে আমি আমার ব্লগপোস্টে এ সম্পর্কে আরও কিছু বিবরণ রেখেছিলাম যখন আমি এতে হোঁচট খেয়েছি : bnpcs.blogspot.com/2009/02/… ফলাফল কোডটি ডিবাগ করার সমস্যা না থাকলে (যদি দীর্ঘ দীর্ঘ লাইনের সমস্যা থাকে তবে এগুলি একটি "ভাষা" দ্বারা উত্পাদিত হয়), এটি সি এর জন্য ব্যবহারিক কোড-জেনারেটর হিসাবে এমনকি ব্যবহারযোগ্য হতে পারে
অ্যান্ড্রু ওয়াই

আমি ঠিক করতে পারি যে এটি চিরকালের জন্য
সংকলিত হয়ে উঠবে

52

সরাসরি কিউটি থেকে:

#define slots   /* */
#define signals /* */

অন্যান্য লিবের সাথে বাস্ট :: সিগন্যাল হিসাবে কথোপকথন করা সত্যিই চমৎকার ... কেবল উদাহরণ, Qt- এ আরও অনেকে রয়েছে যা মজার মজাদার কোড তৈরি করে:

class X : public QObject {
   Q_OBJECT
private slots:
   //...
public signals:
   //...
};

এবং এটি সি ++ ... তবে হঠাৎ:

boost::signals::trackable

আর বৈধ সি ++ নয়।


5
:) সুতরাং এটি কোনও ম্যাক্রো যা অন্য লাইব্রেরিগুলিকে কিছুতেই ভেঙে দেয়। এটি আমার প্রত্যাশার চেয়ে আরও ভাল :)
ডেভিড রডগ্রিজেজ - ড্রিবিস

38
কিউটি খুব আঞ্চলিক এবং এটি অন্য স্থানের লাইব্রেরিগুলিকে আক্রমণাত্মকভাবে আক্রমণ করবে যা এর নাম স্থান দখল করার চেষ্টা করে :)
জেরেমি ফ্রাইজনার

21
দুঃখের সাথে কিউটি ম্যাক্রোগুলির ব্যবহারের সাথে এর
নামস্থলের

7
ভাগ্যক্রমে বুস্ট ::
সিগন্যাল

9
আপনি যদি এই মিথস্ক্রিয়াকে ভয় পান তবে Q_SIGNALS এবং Q_SLOTS ব্যবহার করুন।
টাদিউস এ। কাদুউবস্কি

50

উইন্ডোজ। এর অনেকগুলি ফাংশন রয়েছে যা ম্যাক্রোগুলিকে আপত্তি জানায়।


মিঃভালাদেজ উইন্ডোজ। এইচ-তে পাওয়া গেটোবজেক্ট ম্যাক্রো দ্বারা বিরক্ত হয়েছেন

গেটোবজেক্ট ম্যাক্রো গেটোবজেক্ট () ফাংশনটিকে গেটোবজেক্টএ () বা গেটোবজটব্লিউ () এ পরিবর্তন করে (যদি নির্মানটি যথাক্রমে নন-ইউনিকোড এবং ইউনিকোডে সংকলিত হয় তবে)

মিস্টারওয়ালাদেজ গেটোবজেক্ট ফাংশন লাইনের আগে করণীয়কে ঘৃণা করে

#undef GetObject

Object *GetObject()

বিকল্পটি হ'ল ফাংশনটির নামটি getGameObject () এর মতো অন্য কিছুতে পরিবর্তন করা


মন্তব্যগুলিতে jdkoftinoff এটি পেরেক করেছে: সমস্যাটি হ'ল সমস্ত উইন্ডোজ এপিআই ফাংশন ম্যাক্রোগুলি।

অ্যাডাম রোজেনফিল্ড উল্লেখ করেছেন যে সমস্যাগুলি সরানোর জন্য উইন্ডোজ ডাবল যুক্ত করার আগে NOGDI, WIN32_LEAN_AND_MEAN, NOMINMAX, ইত্যাদি সংজ্ঞায়িত করে সমস্যার সমাধান করা যেতে পারে।


3
আপনি এটিকে দমন করতে পারেন তবে উইন্ডোজ এইচ অন্তর্ভুক্ত করার আগে NOGDI কে # সংজ্ঞায়িত করতে পারেন, অবশ্যই প্রদত্ত যে আপনাকে বিভিন্ন জিডিআই ফাংশন ব্যবহার করার দরকার নেই। অন্যান্য ম্যাক্রোগুলির গুচ্ছ রয়েছে যেমন WIN32_LEAN_AND_MEAN, NOMINMAX ইত্যাদি defined যা অন্যান্য জিনিসকে সংজ্ঞায়িত বা অন্তর্ভুক্ত করা থেকে দমন করে।
অ্যাডাম রোজেনফিল্ড

1
গেটোবজেক্ট একটি সুন্দর জেনেরিক ফাংশন নাম। সংঘর্ষ এড়ানোর জন্য আপনি প্রসঙ্গের ভিত্তিতে আরও বর্ণনামূলক নাম ব্যবহার করতে পারেন। তবে এটি একটি দুর্দান্ত মন্দ ম্যাক্রো কেস case
স্ট্র্যাজার

1
এটি বেশ বিরক্তিকর যে উইন 32 এর এপিআই নামগুলিকে FooA এবং FooW এ রূপান্তর করতে সমস্ত ম্যাক্রো রয়েছে। সেন্ডম্যাসেজ নিয়ে আমাদের সমস্যা আছে।
i_am_jorf

6
সমস্যাটি হ'ল সমস্ত উইন্ডোজ এপিআই ফাংশন হ'ল ম্যাক্রোগুলি। আমার থেকে কিছুটা ছিল গেটটিকাউন্ট ()। যেহেতু আমি আমার বেশিরভাগ প্রোগ্রাম উইন্ডোজের বাইরে করি, তাই আমি উইন্ডোগুলির শিরোনামে সমস্ত সংজ্ঞাগুলি খুঁজে পেয়েছি এবং তারপরে আমার নিজের ফাইল অন্তর্ভুক্ত করে যা সেগুলি আগেই সামঞ্জস্যতা যাচাই করার জন্য সংজ্ঞায়িত করেছিল।
jdkoftinoff

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

45
#define return if (std::random(1000) < 2) throw std::exception(); else return

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


4
কেবলমাত্র এটির পরীক্ষা করা হয়েছে, কমপক্ষে এটি ডিফল্টরূপে সংকলন করে না কারণ এলোমেলোভাবে অন্তর্ভুক্ত রয়েছে এবং এটি তখন লাল-স্কুইগলড। তবে যদি দুর্ঘটনাক্রমে আপনার অন্তর্ভুক্ত থাকে তবে বিষয়গুলি আরও খারাপ হয়ে যায় - ভিসি ++ ২০১০ এটিকে এখনও একটি কীওয়ার্ড হিসাবে চিহ্নিত করে এবং ম্যাক্রো
এক্সপেনশন টুলটিপটি

আমি এটা ভালোবাসি! বিশুদ্ধ প্রতিভা. আপনি যখন এই অ্যাপ্লিকেশনটি "ডিবাগ করুন" তখন অন্য কেউ ম্যানেজ করে নিলে আপনি কতটা ভাল দেখতে পারেন তা কল্পনা করুন।
brice

36

সহকর্মী এবং আমি এই দুটি রত্নকে আমাদের কিছু বস্তু স্ট্রিমিংয়ের কোডে পেয়েছি। এই ম্যাক্রোগুলি প্রতিটি সিঙ্গলে ইনস্ট্যান্ট করা হয়েছিল স্ট্রিমিংয়ের মতো শ্রেণীর ফাইলে । আমাদের কোড বেস জুড়ে কেবল এই ঘৃণ্য কোডটিই ছড়িয়ে পড়ে না, যখন আমরা এটি সম্পর্কে মূল লেখকের কাছে পৌঁছে যাই, তিনি আমাদের অভ্যন্তরীণ উইকিতে একটি 7 পৃষ্ঠার নিবন্ধ লিখেছিলেন যা তিনি এখানে করার চেষ্টা করছেন এটি সম্পাদন করার একমাত্র সম্ভাব্য উপায় হিসাবে এটি রক্ষা করেছিল।

বলা বাহুল্য, এটি এরপরে পুনঃসংশ্লিষ্ট হয়েছে এবং আমাদের কোড বেসে আর ব্যবহার করা হচ্ছে না।

হাইলাইট করা কীওয়ার্ডগুলি দিয়ে ফেলে দেওয়া হবে না। এটি সবই ম্যাক্রো

#define DECLARE_MODIFICATION_REQUEST_PACKET( T )                                                \
namespace NameSpace                                                                     \
{                                                                                       \
                                                                                        \
class T##ElementModificationRequestPacket;                                                          \
}                                                                                       \
                                                                                        \
DECLARE_STREAMING_TEMPLATES( IMPEXP_COMMON_TEMPLATE_DECLARE, NameSpace::ElementModificationRequestPacket<T>, OtherNameSpace::NetPacketBase )    \
DLLIMPEXP_COMMON_TEMPLATE_DECLARE( NameSpace::ElementModificationRequestPacket<T> )     \
DECLARE_AUTOGENERATION_TEMPLATES( DLLIMPEXP_COMMON_TEMPLATE_DECLARE, NameSpace::T##ModificationRequestPacket, NameSpace::ElementModificationRequestPacket<T> )      \
                                                                                        \
namespace NameSpace {                                                                   \
class DLLIMPEXP_COMMON T##ModificationRequestPacket : public ElementModificationRequestPacket<T>\
{                                                                                       \
public:                                                                                 \
    T##ModificationRequestPacket( NetBase * pParent )                                   \
    : ElementModificationRequestPacket<T>( pParent ), m_Gen() {}                            \
                                                                                        \
    T##ModificationRequestPacket( NetBase * pParent,                                    \
                            Action          eAction,                                    \
                            const T &   rT )                                            \
    : ElementModificationRequestPacket<T>( pParent, eAction, rT ), m_Gen() {}               \
                                                                                        \
    T##ModificationRequestPacket( const T##ModificationRequestPacket & rhs )                        \
    : ElementModificationRequestPacket<T>( rhs ), m_Gen() {}                                \
                                                                                        \
    virtual                     ~T##ModificationRequestPacket( void ) {}                        \
                                                                                        \
    virtual Uint32          GetPacketTypeID( void ) const                           \
    {                                                                                   \
        return Net::T##_Modification_REQUEST_PACKET;                                        \
    }                                                                                   \
                                                                                        \
    virtual OtherNameSpace::ClassID GetClassID ( void ) const                           \
    {                                                                                   \
        return OtherNameSpace::NetBase::GenerateHeader( OtherNameSpace::ID__LICENSING,  \
                                                         Net::T##_Modification_REQUEST_PACKET );    \
    }                                                                                   \
                                                                                        \
    virtual T##ModificationRequestPacket * Create( void ) const                             \
    { return new T##ModificationRequestPacket( m_pParent ); }                                   \
                                                                                        \
    T##ModificationRequestPacket() {}                                                           \
                                                                                        \
protected:                                                                              \
    OtherNameSpace::ObjectAutogeneration<T##ModificationRequestPacket> m_Gen;                       \
                                                                                        \
    friend class OtherNameSpace::StreamingBase::StreamingClassInfoT<T##ModificationRequestPacket >;                     \
    OtherNameSpace::StreamingBase::Streaming<T##ModificationRequestPacket, ElementModificationRequestPacket<T> >    m_Stream;   \
                                                                                        \
};                                                                                      \
}                                                                                       \
DLLIMPEXP_COMMON_TEMPLATE_DECLARE( ThirdNameSpace::ListenerBase<const NameSpace::T##ModificationRequestPacket> )            \
DLLIMPEXP_COMMON_TEMPLATE_DECLARE( ThirdNameSpace::BroadcasterT<const NameSpace::T##ModificationRequestPacket> )            \
typedef  ThirdNameSpace::BroadcasterT<const T##ModificationRequestPacket>  T##ModifiedBroadcaster;



#define IMPLEMENT_MODIFICATION_REQUEST_PACKET( T )                                                                  \
DLLIMPEXP_COMMON_TEMPLATE_INSTANTIATE( NameSpace::ElementModificationRequestPacket<T> )                         \
DLLIMPEXP_COMMON_TEMPLATE_INSTANTIATE( ThirdNameSpace::ListenerBase<const NameSpace::T##ModificationRequestPacket> )        \
DLLIMPEXP_COMMON_TEMPLATE_INSTANTIATE( ThirdNameSpace::BroadcasterT<const NameSpace::T##ModificationRequestPacket> )        \
INSTANTIATE_STREAMING_TEMPLATES( DLLIMPEXP_COMMON_TEMPLATE_INSTANTIATE, NameSpace::ElementModificationRequestPacket<T>, OtherNameSpace::NetPacketBase ) \
INSTANTIATE_AUTOGENERATION_TEMPLATES( DLLIMPEXP_COMMON_TEMPLATE_INSTANTIATE, NameSpace::T##ModificationRequestPacket, NameSpace::ElementModificationRequestPacket<T> )

আপডেট (ডিসেম্বর 17, 2009):

এই ঘৃণ্য ম্যাক্রো লেখক সম্পর্কিত আরও সুসংবাদ। আগস্ট মাস পর্যন্ত, এই নৈরাজ্যের জন্য দায়ী কর্মচারীকে বরখাস্ত করা হয়েছিল।


3
তিনি স্পষ্টতই কখনও শুনেন নি: "প্রথম স্থানে কোডটি লেখার তুলনায় দ্বিগুণ হ'ল ডিবাগিং। সুতরাং, আপনি কোডটি যতটা চতুরতার সাথে লিখেছেন, সংজ্ঞা অনুসারে আপনি এটিকে ডিবাগ করার পক্ষে যথেষ্ট স্মার্ট নন।" -বায়ান ডাব্লু। কর্নিগান
ট্রেভর বয়েড স্মিথ

33

আমি নিম্নলিখিতগুলি নিজেই করেছি এবং আমি মনে করি এটি থেকে আমি কিছু শিখেছি।

1992 বা তাই আমি একটি ছোট লিস্প ইন্টারপ্রেটার লিখেছি। এটি সাধারণ সি তে প্রয়োগ করা হয়নি, তবে ব্যাখ্যামূলক সি-জাতীয় ভাষায়। যদিও এই সি-এর মতো ভাষা মানক সি প্রসেসর ব্যবহার করেছে।

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

LISPID car(LISPID id) {
    CHECK_CONS("car", 1, id);
    return cons_cars[id - CONS_OFFSET];
} /* car */

LISPID cdr(LISPID id) {
    CHECK_CONS("cdr", 1, id);
    return cons_cdrs[id - CONS_OFFSET];
} /* cdr */

(ডেটা, অ্যারে মধ্যে সংরক্ষিত হয় যেহেতু কোন structs মধ্যে ছিল। CONS_OFFSET ধ্রুবক 1000. হয়)

লিস্পে গাড়ি এবং সিডিআর প্রায়শই ব্যবহৃত হয়, এবং সংক্ষিপ্ত হয় এবং যেহেতু ফাংশন কলগুলি প্রয়োগের ভাষায় খুব দ্রুত ছিল না, তাই আমি এই দুটি লিস্প ফাংশনকে ম্যাক্রো হিসাবে প্রয়োগ করে আমার কোডটি অনুকূলিত করেছিলাম:

#define car(id) (CHECK_CONS("car", 1, (id)), cons_cars[(id) - CONS_OFFSET])
#define cdr(id) (CHECK_CONS("car", 1, (id)), cons_cdrs[(id) - CONS_OFFSET])

CHECK_CONS এটি পরীক্ষা করে দেখেছে যে এটির যুক্তিটি আসলে একটি তালিকা one এবং যেহেতু এটি দোভাষীর মধ্যেও প্রায়শই ব্যবহৃত হয় এবং সংক্ষিপ্ত, আমি এটিও ম্যাক্রো হিসাবে লিখেছিলাম:

#define CHECK_CONS(fun, pos, arg)   \
    (!IS_CONS(arg) ?        \
        LISP_ERROR("Arg " + pos + " to " + fun +    \
                   " must be a list: " + lispid2string(arg)) : 0)

আইএস_কনস এবং এলআইএসপি_আরআরও প্রায়শই ব্যবহৃত হত, তাই আমি এগুলিকেও ম্যাক্রোতে পরিণত করেছি:

#define IS_CONS(id) \
    (   intp(id) && (id) >= CONS_OFFSET     \
     && ((id) - CONS_OFFSET) < sizeof(cons_cars))

#define LISP_ERROR(str)     (throw((str) + "\n"))

যুক্তিযুক্ত মনে হচ্ছে?

তবে তারপরে কেন পুরো সিস্টেমটি এই লাইনে ক্রাশ করেছে:

id2 = car(car(car(car((id1))));

সমস্যাটি খুঁজে পেতে আমি দীর্ঘ সময় ধরে চেষ্টা করেছি, অবশেষে আমি পরীক্ষা না করেছিলাম যে প্রসেসরটির মাধ্যমে সেই স্বল্প রেখাটি কী প্রসারিত হয়েছে। এটি একটি 31370-চরিত্রের লাইনে প্রসারিত হয়েছিল, যা এখানে আমি স্পষ্টতার জন্য লাইনে বিভক্ত করেছি (এর মধ্যে 502):

id2 = ((!(intp( (((!(intp( (((!(intp( (((!(intp( (id1)) && (
(id1)) >= 1000 && (( (id1)) - 1000) < sizeof(cons_cars)) ?
(throw(("Arg " + 1 + " to " + "car" + " must be a list: " +
lispid2string( (id1))) + "\n")) : 0), cons_cars[(id1) - 1000])))
&& ( (((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000]))) >= 1000 && (( (((!(intp( (id1)) && (
(id1)) >= 1000 && (( (id1)) - 1000) < sizeof(cons_cars)) ?
(throw(("Arg " + 1 + " to " + "car" + " must be a list: " +
lispid2string( (id1))) + "\n")) : 0), cons_cars[(id1) - 1000]))) -
1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" +
" must be a list: " + lispid2string( (((!(intp( (id1)) && ( (id1))
>= 1000 && (( (id1)) - 1000) < sizeof(cons_cars)) ? (throw(("Arg "
+ 1 + " to " + "car" + " must be a list: " + lispid2string(
(id1))) + "\n")) : 0), cons_cars[(id1) - 1000])))) + "\n")) : 0),
cons_cars[(((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1)) -
1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" +
" must be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])) - 1000]))) && ( (((!(intp( (((!(intp(
(id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000]))) && ( (((!(intp( (id1)) && ( (id1)) >=
1000 && (( (id1)) - 1000) < sizeof(cons_cars)) ? (throw(("Arg " +
1 + " to " + "car" + " must be a list: " + lispid2string( (id1)))
+ "\n")) : 0), cons_cars[(id1) - 1000]))) >= 1000 && (( (((!(intp(
(id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000]))) - 1000) < sizeof(cons_cars)) ?
(throw(("Arg " + 1 + " to " + "car" + " must be a list: " +
lispid2string( (((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1))
- 1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car"
+ " must be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])))) + "\n")) : 0), cons_cars[(((!(intp(
(id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])) - 1000]))) >= 1000 && (( (((!(intp(
(((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000]))) && ( (((!(intp( (id1)) && ( (id1)) >=
1000 && (( (id1)) - 1000) < sizeof(cons_cars)) ? (throw(("Arg " +
1 + " to " + "car" + " must be a list: " + lispid2string( (id1)))
+ "\n")) : 0), cons_cars[(id1) - 1000]))) >= 1000 && (( (((!(intp(
(id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000]))) - 1000) < sizeof(cons_cars)) ?
(throw(("Arg " + 1 + " to " + "car" + " must be a list: " +
lispid2string( (((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1))
- 1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car"
+ " must be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])))) + "\n")) : 0), cons_cars[(((!(intp(
(id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])) - 1000]))) - 1000) < sizeof(cons_cars))
? (throw(("Arg " + 1 + " to " + "car" + " must be a list: " +
lispid2string( (((!(intp( (((!(intp( (id1)) && ( (id1)) >= 1000 &&
(( (id1)) - 1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to
" + "car" + " must be a list: " + lispid2string( (id1))) + "\n"))
: 0), cons_cars[(id1) - 1000]))) && ( (((!(intp( (id1)) && (
(id1)) >= 1000 && (( (id1)) - 1000) < sizeof(cons_cars)) ?
(throw(("Arg " + 1 + " to " + "car" + " must be a list: " +
lispid2string( (id1))) + "\n")) : 0), cons_cars[(id1) - 1000])))
>= 1000 && (( (((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1)) -
1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" +
" must be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000]))) - 1000) < sizeof(cons_cars)) ?
(throw(("Arg " + 1 + " to " + "car" + " must be a list: " +
lispid2string( (((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1))
- 1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car"
+ " must be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])))) + "\n")) : 0), cons_cars[(((!(intp(
(id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])) - 1000])))) + "\n")) : 0),
cons_cars[(((!(intp( (((!(intp( (id1)) && ( (id1)) >= 1000 && ((
(id1)) - 1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to "
+ "car" + " must be a list: " + lispid2string( (id1))) + "\n")) :
0), cons_cars[(id1) - 1000]))) && ( (((!(intp( (id1)) && ( (id1))
>= 1000 && (( (id1)) - 1000) < sizeof(cons_cars)) ? (throw(("Arg "
+ 1 + " to " + "car" + " must be a list: " + lispid2string(
(id1))) + "\n")) : 0), cons_cars[(id1) - 1000]))) >= 1000 && ((
(((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000]))) - 1000) < sizeof(cons_cars)) ?
(throw(("Arg " + 1 + " to " + "car" + " must be a list: " +
lispid2string( (((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1))
- 1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car"
+ " must be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])))) + "\n")) : 0), cons_cars[(((!(intp(
(id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])) - 1000])) - 1000]))) && ( (((!(intp(
(((!(intp( (((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1)) -
1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" +
" must be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000]))) && ( (((!(intp( (id1)) && ( (id1)) >=
1000 && (( (id1)) - 1000) < sizeof(cons_cars)) ? (throw(("Arg " +
1 + " to " + "car" + " must be a list: " + lispid2string( (id1)))
+ "\n")) : 0), cons_cars[(id1) - 1000]))) >= 1000 && (( (((!(intp(
(id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000]))) - 1000) < sizeof(cons_cars)) ?
(throw(("Arg " + 1 + " to " + "car" + " must be a list: " +
lispid2string( (((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1))
- 1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car"
+ " must be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])))) + "\n")) : 0), cons_cars[(((!(intp(
(id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])) - 1000]))) && ( (((!(intp( (((!(intp(
(id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000]))) && ( (((!(intp( (id1)) && ( (id1)) >=
1000 && (( (id1)) - 1000) < sizeof(cons_cars)) ? (throw(("Arg " +
1 + " to " + "car" + " must be a list: " + lispid2string( (id1)))
+ "\n")) : 0), cons_cars[(id1) - 1000]))) >= 1000 && (( (((!(intp(
(id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000]))) - 1000) < sizeof(cons_cars)) ?
(throw(("Arg " + 1 + " to " + "car" + " must be a list: " +
lispid2string( (((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1))
- 1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car"
+ " must be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])))) + "\n")) : 0), cons_cars[(((!(intp(
(id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])) - 1000]))) >= 1000 && (( (((!(intp(
(((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000]))) && ( (((!(intp( (id1)) && ( (id1)) >=
1000 && (( (id1)) - 1000) < sizeof(cons_cars)) ? (throw(("Arg " +
1 + " to " + "car" + " must be a list: " + lispid2string( (id1)))
+ "\n")) : 0), cons_cars[(id1) - 1000]))) >= 1000 && (( (((!(intp(
(id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000]))) - 1000) < sizeof(cons_cars)) ?
(throw(("Arg " + 1 + " to " + "car" + " must be a list: " +
lispid2string( (((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1))
- 1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car"
+ " must be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])))) + "\n")) : 0), cons_cars[(((!(intp(
(id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])) - 1000]))) - 1000) < sizeof(cons_cars))
? (throw(("Arg " + 1 + " to " + "car" + " must be a list: " +
lispid2string( (((!(intp( (((!(intp( (id1)) && ( (id1)) >= 1000 &&
(( (id1)) - 1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to
" + "car" + " must be a list: " + lispid2string( (id1))) + "\n"))
: 0), cons_cars[(id1) - 1000]))) && ( (((!(intp( (id1)) && (
(id1)) >= 1000 && (( (id1)) - 1000) < sizeof(cons_cars)) ?
(throw(("Arg " + 1 + " to " + "car" + " must be a list: " +
lispid2string( (id1))) + "\n")) : 0), cons_cars[(id1) - 1000])))
>= 1000 && (( (((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1)) -
1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" +
" must be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000]))) - 1000) < sizeof(cons_cars)) ?
(throw(("Arg " + 1 + " to " + "car" + " must be a list: " +
lispid2string( (((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1))
- 1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car"
+ " must be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])))) + "\n")) : 0), cons_cars[(((!(intp(
(id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])) - 1000])))) + "\n")) : 0),
cons_cars[(((!(intp( (((!(intp( (id1)) && ( (id1)) >= 1000 && ((
(id1)) - 1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to "
+ "car" + " must be a list: " + lispid2string( (id1))) + "\n")) :
0), cons_cars[(id1) - 1000]))) && ( (((!(intp( (id1)) && ( (id1))
>= 1000 && (( (id1)) - 1000) < sizeof(cons_cars)) ? (throw(("Arg "
+ 1 + " to " + "car" + " must be a list: " + lispid2string(
(id1))) + "\n")) : 0), cons_cars[(id1) - 1000]))) >= 1000 && ((
(((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000]))) - 1000) < sizeof(cons_cars)) ?
(throw(("Arg " + 1 + " to " + "car" + " must be a list: " +
lispid2string( (((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1))
- 1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car"
+ " must be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])))) + "\n")) : 0), cons_cars[(((!(intp(
(id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])) - 1000])) - 1000]))) >= 1000 && ((
(((!(intp( (((!(intp( (((!(intp( (id1)) && ( (id1)) >= 1000 && ((
(id1)) - 1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to "
+ "car" + " must be a list: " + lispid2string( (id1))) + "\n")) :
0), cons_cars[(id1) - 1000]))) && ( (((!(intp( (id1)) && ( (id1))
>= 1000 && (( (id1)) - 1000) < sizeof(cons_cars)) ? (throw(("Arg "
+ 1 + " to " + "car" + " must be a list: " + lispid2string(
(id1))) + "\n")) : 0), cons_cars[(id1) - 1000]))) >= 1000 && ((
(((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000]))) - 1000) < sizeof(cons_cars)) ?
(throw(("Arg " + 1 + " to " + "car" + " must be a list: " +
lispid2string( (((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1))
- 1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car"
+ " must be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])))) + "\n")) : 0), cons_cars[(((!(intp(
(id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])) - 1000]))) && ( (((!(intp( (((!(intp(
(id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000]))) && ( (((!(intp( (id1)) && ( (id1)) >=
1000 && (( (id1)) - 1000) < sizeof(cons_cars)) ? (throw(("Arg " +
1 + " to " + "car" + " must be a list: " + lispid2string( (id1)))
+ "\n")) : 0), cons_cars[(id1) - 1000]))) >= 1000 && (( (((!(intp(
(id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000]))) - 1000) < sizeof(cons_cars)) ?
(throw(("Arg " + 1 + " to " + "car" + " must be a list: " +
lispid2string( (((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1))
- 1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car"
+ " must be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])))) + "\n")) : 0), cons_cars[(((!(intp(
(id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])) - 1000]))) >= 1000 && (( (((!(intp(
(((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000]))) && ( (((!(intp( (id1)) && ( (id1)) >=
1000 && (( (id1)) - 1000) < sizeof(cons_cars)) ? (throw(("Arg " +
1 + " to " + "car" + " must be a list: " + lispid2string( (id1)))
+ "\n")) : 0), cons_cars[(id1) - 1000]))) >= 1000 && (( (((!(intp(
(id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000]))) - 1000) < sizeof(cons_cars)) ?
(throw(("Arg " + 1 + " to " + "car" + " must be a list: " +
lispid2string( (((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1))
- 1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car"
+ " must be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])))) + "\n")) : 0), cons_cars[(((!(intp(
(id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])) - 1000]))) - 1000) < sizeof(cons_cars))
? (throw(("Arg " + 1 + " to " + "car" + " must be a list: " +
lispid2string( (((!(intp( (((!(intp( (id1)) && ( (id1)) >= 1000 &&
(( (id1)) - 1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to
" + "car" + " must be a list: " + lispid2string( (id1))) + "\n"))
: 0), cons_cars[(id1) - 1000]))) && ( (((!(intp( (id1)) && (
(id1)) >= 1000 && (( (id1)) - 1000) < sizeof(cons_cars)) ?
(throw(("Arg " + 1 + " to " + "car" + " must be a list: " +
lispid2string( (id1))) + "\n")) : 0), cons_cars[(id1) - 1000])))
>= 1000 && (( (((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1)) -
1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" +
" must be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000]))) - 1000) < sizeof(cons_cars)) ?
(throw(("Arg " + 1 + " to " + "car" + " must be a list: " +
lispid2string( (((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1))
- 1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car"
+ " must be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])))) + "\n")) : 0), cons_cars[(((!(intp(
(id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])) - 1000])))) + "\n")) : 0),
cons_cars[(((!(intp( (((!(intp( (id1)) && ( (id1)) >= 1000 && ((
(id1)) - 1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to "
+ "car" + " must be a list: " + lispid2string( (id1))) + "\n")) :
0), cons_cars[(id1) - 1000]))) && ( (((!(intp( (id1)) && ( (id1))
>= 1000 && (( (id1)) - 1000) < sizeof(cons_cars)) ? (throw(("Arg "
+ 1 + " to " + "car" + " must be a list: " + lispid2string(
(id1))) + "\n")) : 0), cons_cars[(id1) - 1000]))) >= 1000 && ((
(((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000]))) - 1000) < sizeof(cons_cars)) ?
(throw(("Arg " + 1 + " to " + "car" + " must be a list: " +
lispid2string( (((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1))
- 1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car"
+ " must be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])))) + "\n")) : 0), cons_cars[(((!(intp(
(id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])) - 1000])) - 1000]))) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (((!(intp( (((!(intp( (((!(intp(
(id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000]))) && ( (((!(intp( (id1)) && ( (id1)) >=
1000 && (( (id1)) - 1000) < sizeof(cons_cars)) ? (throw(("Arg " +
1 + " to " + "car" + " must be a list: " + lispid2string( (id1)))
+ "\n")) : 0), cons_cars[(id1) - 1000]))) >= 1000 && (( (((!(intp(
(id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000]))) - 1000) < sizeof(cons_cars)) ?
(throw(("Arg " + 1 + " to " + "car" + " must be a list: " +
lispid2string( (((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1))
- 1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car"
+ " must be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])))) + "\n")) : 0), cons_cars[(((!(intp(
(id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])) - 1000]))) && ( (((!(intp( (((!(intp(
(id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000]))) && ( (((!(intp( (id1)) && ( (id1)) >=
1000 && (( (id1)) - 1000) < sizeof(cons_cars)) ? (throw(("Arg " +
1 + " to " + "car" + " must be a list: " + lispid2string( (id1)))
+ "\n")) : 0), cons_cars[(id1) - 1000]))) >= 1000 && (( (((!(intp(
(id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000]))) - 1000) < sizeof(cons_cars)) ?
(throw(("Arg " + 1 + " to " + "car" + " must be a list: " +
lispid2string( (((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1))
- 1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car"
+ " must be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])))) + "\n")) : 0), cons_cars[(((!(intp(
(id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])) - 1000]))) >= 1000 && (( (((!(intp(
(((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000]))) && ( (((!(intp( (id1)) && ( (id1)) >=
1000 && (( (id1)) - 1000) < sizeof(cons_cars)) ? (throw(("Arg " +
1 + " to " + "car" + " must be a list: " + lispid2string( (id1)))
+ "\n")) : 0), cons_cars[(id1) - 1000]))) >= 1000 && (( (((!(intp(
(id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000]))) - 1000) < sizeof(cons_cars)) ?
(throw(("Arg " + 1 + " to " + "car" + " must be a list: " +
lispid2string( (((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1))
- 1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car"
+ " must be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])))) + "\n")) : 0), cons_cars[(((!(intp(
(id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])) - 1000]))) - 1000) < sizeof(cons_cars))
? (throw(("Arg " + 1 + " to " + "car" + " must be a list: " +
lispid2string( (((!(intp( (((!(intp( (id1)) && ( (id1)) >= 1000 &&
(( (id1)) - 1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to
" + "car" + " must be a list: " + lispid2string( (id1))) + "\n"))
: 0), cons_cars[(id1) - 1000]))) && ( (((!(intp( (id1)) && (
(id1)) >= 1000 && (( (id1)) - 1000) < sizeof(cons_cars)) ?
(throw(("Arg " + 1 + " to " + "car" + " must be a list: " +
lispid2string( (id1))) + "\n")) : 0), cons_cars[(id1) - 1000])))
>= 1000 && (( (((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1)) -
1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" +
" must be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000]))) - 1000) < sizeof(cons_cars)) ?
(throw(("Arg " + 1 + " to " + "car" + " must be a list: " +
lispid2string( (((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1))
- 1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car"
+ " must be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])))) + "\n")) : 0), cons_cars[(((!(intp(
(id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])) - 1000])))) + "\n")) : 0),
cons_cars[(((!(intp( (((!(intp( (id1)) && ( (id1)) >= 1000 && ((
(id1)) - 1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to "
+ "car" + " must be a list: " + lispid2string( (id1))) + "\n")) :
0), cons_cars[(id1) - 1000]))) && ( (((!(intp( (id1)) && ( (id1))
>= 1000 && (( (id1)) - 1000) < sizeof(cons_cars)) ? (throw(("Arg "
+ 1 + " to " + "car" + " must be a list: " + lispid2string(
(id1))) + "\n")) : 0), cons_cars[(id1) - 1000]))) >= 1000 && ((
(((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000]))) - 1000) < sizeof(cons_cars)) ?
(throw(("Arg " + 1 + " to " + "car" + " must be a list: " +
lispid2string( (((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1))
- 1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car"
+ " must be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])))) + "\n")) : 0), cons_cars[(((!(intp(
(id1)) && ( (id1)) >= 1000 && (( (id1)) - 1000) <
sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" + " must
be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000])) - 1000])) - 1000])))) + "\n")) : 0),
cons_cars[(((!(intp( (((!(intp( (((!(intp( (id1)) && ( (id1)) >=
1000 && (( (id1)) - 1000) < sizeof(cons_cars)) ? (throw(("Arg " +
1 + " to " + "car" + " must be a list: " + lispid2string( (id1)))
+ "\n")) : 0), cons_cars[(id1) - 1000]))) && ( (((!(intp( (id1))
&& ( (id1)) >= 1000 && (( (id1)) - 1000) < sizeof(cons_cars)) ?
(throw(("Arg " + 1 + " to " + "car" + " must be a list: " +
lispid2string( (id1))) + "\n")) : 0), cons_cars[(id1) - 1000])))
>= 1000 && (( (((!(intp( (id1)) && ( (id1)) >= 1000 && (( (id1)) -
1000) < sizeof(cons_cars)) ? (throw(("Arg " + 1 + " to " + "car" +
" must be a list: " + lispid2string( (id1))) + "\n")) : 0),
cons_cars[(id1) - 1000]))) - 1000) < sizeof(cons_cars))

18
I optimized my code by implementing those [..] functions as macros- বিখ্যাত শেষ শব্দগুলি ...
ব্লুরাজা - ড্যানি প্লেফুঘুফ্ট

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

29

আমাকে একবার ইউনিক্স থেকে উইন্ডোতে সি অ্যাপ্লিকেশন পোর্ট করতে হয়েছিল, যার নির্দিষ্ট প্রকৃতি দোষীদের রক্ষার জন্য নামহীন থাকবে। যে লোকটি এটি লিখেছিল সে একজন প্রফেসর ছিলেন প্রডাকশন কোড লেখার ক্ষেত্রে অসন্তুষ্ট এবং অন্য কোনও ভাষা থেকে স্পষ্টতই সিটিতে এসেছিলেন। এটি আরও ঘটে যে ইংরেজী তাঁর প্রথম ভাষা ছিল না, যদিও তিনি যে দেশটিতে এসেছিলেন সেখানকার সংখ্যাগরিষ্ঠ লোকেরা এটি বেশ ভাল বলেছিলেন।

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

#define I  Any void_me
#define thou  Any void_thee
#define iam(klas)  klas me = (klas) void_me
#define thouart(klas)  klas thee = (klas) void_thee
#define my  me ->
#define thy  thee ->
#define his  him ->
#define our  my methods ->
#define your  thy methods ->

... যা তিনি তখন নীচের মতো মনস্ট্রোসিটি লিখতেন:

void Thing_setName (I, const char *name) {
iam (Thing);
if (name != my name) {
    Melder_free (my name);
    my name = Melder_wcsdup (name);
    }
    our nameChanged (me);
}

void Thing_overrideClass (I, void *klas) {
iam (Thing);
my methods = (Thing_Table)klas;
if (! ((Thing_Table) klas) -> destroy)
    ((Thing_Table) klas) -> _initialize (klas);
}

পুরো প্রকল্পটি (,000 60,000 এলওসি) একই ধরণের লিখিত ছিল - মার্কো হেল্ক, অদ্ভুত নাম, ওল্ড-ইংলিশ জার্গন ইত্যাদি Fort ভাগ্যক্রমে আমরা কোডটি ছুঁড়ে ফেলতে পেরেছিলাম যেহেতু আমি একটি ওএসএস লাইব্রেরি পেয়েছি যা একই অ্যালগরিদম কয়েক ডজন কাজ করেছিল performed দ্রুত গতিতে।

(আমি এই উত্তরটি অনুলিপি করে সম্পাদনা করেছি যা আমি এই প্রশ্নটিতে মূলত তৈরি করেছি )।


3
আমি বরং অধিকারী এবং প্রত্নতাত্ত্বিক ইংরেজী দ্বারা আকৃষ্ট হই, অবশ্যই আমি সম্মত হই যে কোডটি ভয়ানক দেখাচ্ছে।
দারিয়াস বেকন

27

সবচেয়ে খারাপ আমি যা করেছি তার মধ্যে এমন একটি পণ্য ছিল যেখানে এক্সিকিউটেবলের স্যুট থাকে যেখানে মনোনীত প্রযুক্তিগত নেতা লাইব্রেরিগুলি সন্ধান করেননি।

পরিবর্তে, তার কাছে বেশ কয়েকটি ভিজ্যুয়াল সোর্স নিরাপদ ফোল্ডারগুলিতে ভাগ করা ফাইলগুলির সেট ছিল। তারপরে তিনি বুঝতে পারলেন যে প্রতিটি অ্যাপ্লিকেশনের জন্য তাদের কিছুটা আলাদা আচরণ করা দরকার।

আপনি এখানে প্রয়োগ করতে পারেন এমন অনেকগুলি রিফ্যাক্টরিং পদক্ষেপ রয়েছে।

পরিবর্তে, তিনি #ifdefs ব্যবহার করেছেন

   void DisplayLoadError()
   {
   #if defined __TIMETABLE_EDITOR
   MessageBox("Timetable Editor failed to load the correct timetable", MB_ERROR);
   #else if defined __SCHEDULESET_EDITOR
   MessageBox("Schedule Set Editor faied to load the correct Schedule Set", MB_ERROR);
   #else if defined __ROSTER_EDITOR
   MessageBox("Roster Editor failed to load the correct Roster", MB_ERROR);
   #endif
   }

17

নেটওয়ার্ক পেরিয়ে যাওয়া বার্তাগুলির জন্য অনন্য আইডি উত্পন্ন করতে লাইন প্রিপ্রোসেসর ব্যবহার:

NetworkMessages.h

#define MSG_LOGIN  __LINE__
#define MSG_LOGOUT __LINE__
#define MSG_CHAT   __LINE__

এটি এমন একটি উদাহরণ যেখানে ম্যাক্রো একটি নন-ম্যাক্রো সমাধানের চেয়ে সত্যিই ভাল ছিল:

নন-ম্যাক্রো সলিউশন ক্লাসে, বার্তাটি কী আইডি তা ট্র্যাক রাখতে ফাংশন এবং ভেরিয়েবলগুলি তৈরি করতে হবে। বিকাশকারী ম্যাসেজ আইডি ট্র্যাকিংটিকে জটিল করে তুলতে পারে বা নাও করতে পারে তবে এটি পড়া এবং ডিবাগ করা সহজ।

এছাড়াও, উত্সটিতে বার্তা যুক্ত করে নতুন বার্তাগুলি যুক্ত করা সহজ।

এই পরিস্থিতির অসুবিধাটি হ'ল ফাইলটি বার্তাগুলি ব্যবহার করে এমন সমস্ত কোডে অন্তর্ভুক্ত করতে হবে। যখনই কোনও বার্তা সম্পাদনা করা হয় তখন সংকলনের সময় বাড়ত।


8
এবং সংস্করণগুলি একে অপরের সাথে বেমানান হতে পারে (ভাল নয়!) কিভাবে একটি এনাম যথেষ্ট না?
স্ট্র্যাজার

এই এবং এনাম উভয়েরই অসামঞ্জস্যতার একই সমস্যা রয়েছে।
মিঃভালদেজ 17'09

17
এখন আমি এগিয়ে এসে # নির্ধারিত ... এবং প্রোটোকল পরিবর্তনগুলি বাছাই করেছি। অথবা আমি ডক্সিজেন ধর্ম পেয়েছি এবং সমস্ত বার্তা কোডগুলি এবং প্রোটোকল পরিবর্তনগুলি নথি করি। অন্ততপক্ষে পরিবর্তনের অধীনে কমপক্ষে একটি এনাম স্থিতিশীল।
আরবেরটিগ

3
@ এমআরভালাদেজ, ফাইল শুরুর তুলনায় একই লাইনে সংজ্ঞায়িত করার চেয়ে এনামগুলিকে একটি ব্লক রাখতে যথাযথ প্রতিবন্ধকতা নেই।
পিটারচেন

আমি জানি এটি একটি পুরানো পোস্ট, তবে এটি কি কাজ করে? আমি বলতে চাচ্ছি # define শুধু বার্তা ধ্রুবক প্রতিস্থাপন করবে লাইন এবং শুধুমাত্র তারপর লাইন , লাইন সংখ্যা প্রসারিত করা হবে যাতে প্রতিটি সময় আমরা বিভিন্ন লাইন একই ধ্রুবক ব্যবহার করেন - এটা (বর্তমান লাইন নম্বরে) পরিবর্তিত হবে?
XzKto

16

একটি মোটামুটি খারাপ উদাহরণ:

#ifdef __cplusplus
#define class _vclass
#endif

এটি একটি সি কাঠামোকে মেম্বার ভেরিয়েবল যুক্ত classসি ++ কম্পাইলার দ্বারা পরিচালিত হওয়ার জন্য অনুমতি দেয়। এটিতে এই নির্মাণের সাথে দুটি শিরোনাম রয়েছে; এর একটিতে শেষে '#undef ক্লাস' রয়েছে এবং অন্যটিতে নেই।


1
এজন্য অবজেক্টিভ-সি এর @classপরিবর্তে ব্যবহার করে class

14

আন্তর্জাতিক অবরুদ্ধ সি কোডিং প্রতিযোগিতার এক বছরে, একটি প্রোগ্রাম ছিল যেখানে পুরো প্রোগ্রামটি ছিল:

P

অনুবিধি আপনি নির্ধারণ করতে পারে যে PMakefile মধ্যে যাই হোক না কেন প্রোগ্রাম আপনি চেয়েছিলেন যাবে।

আমার মনে আছে, এটি বিভাগগুলির মধ্যে একটিতে জিতেছে এবং পরের বছর একটি নিয়ম এই স্টাইলের প্রবেশের বিষয়টি অস্বীকার করে পপ আপ করেছিল।

(সম্পাদনা করুন: ছয় মাস পরে বা কিছু ... আমি নিশ্চিত যে "আইওসিসিসি" জিনিসটি মূল প্রশ্নে ছিল না যখন আমি এটি লিখেছিলাম ...)


12

আমি একদিন বিরক্ত হয়েছি এবং অবজেক্টিভ-সি-তে ব্লক নিয়ে ঘুরে বেড়াছিলাম ...

#define Lambda(var, body) [^ id(id (var)) { return (body);} copy]
#define Call(f, arg) ((id(^)(id))(f))(arg)
#define Int(num) [NSNumber numberWithInteger:(num)]
#define Mult(a, b) Int([(a) integerValue] * [(b) integerValue])
#define Add(a, b) Int([(a) integerValue] + [(b) integerValue])
#define Sub1(n) Int([(n) integerValue] - 1)
#define Add1(n) Int([(n) integerValue] + 1)
#define If(cond, thenblock, elseblock) ([(cond) integerValue] ? (thenblock) : (elseblock))
#define Cons(car, cdr_) [[ConsType alloc] initWithCar:(car) cdr:(cdr_)]
#define Car(list) [(list) car]
#define Cdr(list) [(list) cdr]
#define Define(var, value) id var = (value)
#define Nullq(value) Int(value == nil)

"আকর্ষণীয়" জিনিসগুলি যেমন:

Define(Y, Lambda(f, Call(Lambda(x, Call(x, x)),
                         Lambda(x, Call(f, Lambda(y, Call(Call(x, x), y)))))));
Define(AlmostTotal, Lambda(f, Lambda(list, If(Nullq(list), Int(0),
                                              Add(Car(list), Call(f, Cdr(list)))))));
Define(Total, Call(Y, AlmostTotal));
Print(Call(Total, Cons(Int(4), Cons(Int(5), Cons(Int(8), nil)))));

(কিছু ফাংশন এবং শ্রেণীর সংজ্ঞা সংক্ষিপ্ততার জন্য দেখানো হয়নি)


"আমি একদিন বিরক্ত হয়েছি" বিখ্যাত বিকাশকারী শেষ শব্দগুলি :)
রিচার্ড জে। রস তৃতীয়

11

সবচেয়ে খারাপটি আমি দেখেছি এটি অ-ব্যবহার :-)

কেউ একটি স্ট্রিপিপি লিখেছেন (আমার মনে হয় এটি ছিল ... এখন 10 বছর আগে) একটি পদ্ধতির অভ্যন্তরে ফাংশন (কারণ তারা আরআরসিপি কল করার ওভারহেড চায়নি ... দীর্ঘশ্বাস ফেলল)।

তারা দৃ cl়ভাবে জানিয়েছিল যে এটি জাপানি চরিত্রগুলির জন্য কাজ করবে না তাই তারা এএসসিআইআই বা ইউনিকোড করতে শুরু করতে "যদি" যুক্ত করেছিল। এই মুহুর্তে কোডটি একটি স্ক্রিন দীর্ঘ ছিল ... সম্ভবত ক্যাশে সংহততা হত্যা এবং কোডটি অন্তর্ভুক্ত করার জন্য তার অনুমিত সঞ্চয় মোছা।

কোডগুলি ধরণের জন্য অভিন্ন সংরক্ষণ ছিল (সুতরাং ম্যাক্রো ব্যবহার করা উচিত ছিল)।

অবশ্যই তারা লিখেছিল যে স্ট্রাইকপিটি স্ট্যান্ডার্ড লাইব্রেরিতে থাকা হাতের সুরযুক্ত এসেম্বেবলারের চেয়ে অনেক ধীর ছিল ...

অবশ্যই তারা যদি ম্যাক্রো হিসাবে কেবল এই সমস্ত কাজটি করে থাকে তবে এটি স্ট্রাইকপি-তে একটি কল দিয়ে প্রতিস্থাপন করা যেতে পারে ...

অবশ্যই আমি সংস্থাটি ছেড়ে দিয়েছি (সরাসরি সে কারণে নয় ...)


The code was identical save for the types (so should have used a macro).না, তার একটি টেম্পলেট ব্যবহার করা উচিত ছিল।
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট

1
তার উচিত ছিল অন্তর্নির্মিত টিআরসিপিপি ব্যবহার করা! (এবং এটি সি কোডটি সি ++ তেমন কোনও টেমপ্লেট নয়) :
পি

অকালীন অপটিমাইজেশন হ'ল সমস্ত অশুভের মূল।
হুবার্ট কারিও

11

বাধ্যতামূলক

#define FOR  for

এবং

#define ONE  1
#define TWO  2
...

কে জানত?


5
কিন্তু-তবে-তে কিন্তু কোডে কোনও লিটারেল নেই! ;)
বার্নার্ড

তারা এখনও আক্ষরিক সোম হয়, উদ্দেশ্য নাম / উদ্দেশ্য অনুসারে তাদের নাম রাখা উচিত বিকল্প চিহ্ন নয়। কোবোল কোডটি আমি তাদের সম্পর্কে ভেরিয়েবল 5 = 5 করার কথা শুনেছি তারপরে কোডটি 5 = 10 সেট করে
লিখেছিল

1
কোবোলের সাথে এটি কখনও শুনেনি, কেবল ফরটারনের সাথে। কোবোলের অবশ্যই জিরো, জিরোস এবং জিরোস সংরক্ষিত শব্দ হিসাবে রয়েছে, এগুলির সমস্তই 0 হিসাবে একই জিনিসটির অর্থ
ডেভিড থর্নলে

"# নির্ধারিত ওয়ান 0" এর চেয়ে অনেক বেশি ভাল। আপনি যদি গিগল চান, তবে তার জন্য ওয়েবটি অনুসন্ধান করুন এবং হিরো-শূন্য সংখ্যার দ্বারা অবাক হোন।
পুনরায়

11
#define TRUE 0 // dumbass

যে ব্যক্তি এটি করেছিলেন সে কয়েক বছর পরে নিজেকে ব্যাখ্যা করেছিল - বেশিরভাগ (সমস্ত না থাকলে) সি লাইব্রেরি ফাংশন 0 ফিরে আসে এমন ইঙ্গিত হিসাবে যে সবকিছু ঠিকঠাক হয়েছে। সুতরাং, তিনি এই জাতীয় কোড লিখতে সক্ষম হতে চেয়েছিলেন:

if (memcpy(buffer, packet, BUFFER_SIZE) == TRUE) {
; // rape that packet
}

বলা বাহুল্য, আমাদের দলে কেউ (পরীক্ষক বা বিকাশকারী) কখনও তার কোডটি একবার দেখার জন্য সাহস করে নি।


1
আমি 0 "সবকিছু ঠিক আছে" তৈরির জন্য সি লাইব্রেরির ফাংশনগুলিকে দোষ
দিচ্ছি

6
কেন এমন কিছু ঘোষণা করবেন না #define FLAG_SUCCESS 0?
পাইউন

11

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

#define CHECK_ERROR if (!SomeCondition) goto Cleanup

void SomeFunction() 
{ 
    SomeLongFunctionName(ParamOne, ParamTwo, ParamThree, ParamFour); CHECK_ERROR  
    //SomeOtherCode  
    Cleanup:    
   //Cleanup code  
}

সবচেয়ে খারাপটি তখন হ'ল যখন ম্যাক্রোগুলি gotoলক্ষ্য বিবরণগুলির সংজ্ঞা এবং পাশাপাশি বিবৃতিগুলি উভয়টি আড়াল করে । পুরোপুরি যাদু।
পুনরায়

আমি এটি থেকে ভুগছি - তবে ম্যাক্রোগুলি ফাংশন কলগুলির মতো দেখছিল।
জোনাথন লেফলার

10
#include <iostream>
#define public_static_void_main(x) int main()
#define System_out_println(x) std::cout << x << std::endl

public_static_void_main(String[] args) {
  System_out_println("Hello World!");
}

3
এবং আপনি একটি রানটাইম লিখতে চেয়েছিলেন। দেখি কতটা সময় বাঁচিয়েছি!
বার্নার্ড

4
@ ট্রেভর: হ্যাঁ ... স্মার্ট ব্যক্তিরা তার পরিবর্তে এখনও জাভা করছে। কভার জন্য সঞ্চালিত হয়
মাইকেল ম্যাইইয়ার্স

আপনি যদি আগের পরিবর্তে আরগস পরে [] রাখেন এবং "# ডেফাইন স্ট্রিং ইন্ট আরগসি, চর *" রাখেন তবে এটি সংকলিত হবে (দুঃখের সাথে)।
অ্যাডাম রোজেনফিল্ড

16
আমি অন্য একটি ভাল পছন্দ। এইটি কয়েকটা ম্যাক্রো দিয়ে জাভাটির কাছাকাছি লেখা রয়েছে shows অন্য একটিতে দেখানো হয়েছে যে জাভা ঠিক লুক্কায়িত ম্যাক্রোগুলির আধিক্য এবং ফাংশন সদস্যদের সাথে স্ট্রাক্ট নিয়ে লেখা হয়েছিল। প্রথমটি ছিল একটি সস্তা কৌতুক, অন্যদিকে ছিল একটি বিস্তৃত এবং ভাল-তবুও রসিকতা।
ক্রিস লুটজ

10

এমন এক সহপাঠীর দ্বারা যিনি ম্যাজিক সংখ্যা সম্পর্কে নিয়মগুলি বুঝতে ব্যর্থ হন:
#define TWO_HUNDRED_AND_EIGHTY_THREE_POINT_ONE 283.1


9

এএসএ - http://www.ingber.com/#ASA

আপনার প্রশংসা করার জন্য আপনাকে এটি ডাউনলোড করতে হবে। পুরো কাজের প্রবাহ ম্যাক্রো দ্বারা নির্ধারিত হয়। এটি সম্পূর্ণ অপঠনযোগ্য। উদাহরণ হিসাবে -

 if (asa_open == FALSE) {
asa_open = TRUE;
++number_asa_open;
#if ASA_PRINT
if (number_asa_open == 1) {
  /* open the output file */
#if USER_ASA_OUT
  if (!strcmp (OPTIONS->Asa_Out_File, "STDOUT")) {
#if INCL_STDOUT
    ptr_asa_out = stdout;
#endif /* INCL_STDOUT */
  } else {
#if ASA_SAVE
    ptr_asa_out = fopen (OPTIONS->Asa_Out_File, "a");
#else
    ptr_asa_out = fopen (OPTIONS->Asa_Out_File, "w");
#endif
  }
#else /* USER_ASA_OUT */
  if (!strcmp (ASA_OUT, "STDOUT")) {
#if INCL_STDOUT
    ptr_asa_out = stdout;
#endif /* INCL_STDOUT */
  } else {
#if ASA_SAVE
    ptr_asa_out = fopen (ASA_OUT, "a");
#else
    ptr_asa_out = fopen (ASA_OUT, "w");
#endif
  }
#endif /* USER_ASA_OUT */
} else {
#if USER_ASA_OUT
  if (!strcmp (OPTIONS->Asa_Out_File, "STDOUT")) {
#if INCL_STDOUT
    ptr_asa_out = stdout;
#endif /* INCL_STDOUT */
  } else {
    ptr_asa_out = fopen (OPTIONS->Asa_Out_File, "a");
  }
#else
  if (!strcmp (ASA_OUT, "STDOUT")) {
#if INCL_STDOUT
    ptr_asa_out = stdout;
#endif /* INCL_STDOUT */
  } else {
    ptr_asa_out = fopen (ASA_OUT, "a");
  }
#endif
  fprintf (ptr_asa_out, "\n\n\t\t number_asa_open = %d\n",
           number_asa_open);
}
#endif /* ASA_PRINT */
} else {
++recursive_asa_open;
#if ASA_PRINT
if (recursive_asa_open == 1) {
  /* open the output file */
#if ASA_SAVE
#if USER_ASA_OUT
  if (!strcmp (OPTIONS->Asa_Out_File, "STDOUT")) {
#if INCL_STDOUT
    ptr_asa_out = stdout;
#endif /* INCL_STDOUT */
  } else {
    ptr_asa_out = fopen (OPTIONS->Asa_Out_File, "a");
  }
#else
  if (!strcmp (ASA_OUT, "STDOUT")) {
#if INCL_STDOUT
    ptr_asa_out = stdout;
#endif /* INCL_STDOUT */
  } else {
    ptr_asa_out = fopen (ASA_OUT, "a");
  }
#endif
#else /* ASA_SAVE */
#if USER_ASA_OUT
  if (!strcmp (OPTIONS->Asa_Out_File, "STDOUT")) {
#if INCL_STDOUT
    ptr_asa_out = stdout;
#endif /* INCL_STDOUT */
  } else {

ইত্যাদি।

এবং এটি ঠিক অপশন সেট আপ করা হয়। পুরো প্রোগ্রামটি এর মতো।


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