C Language
सामान्य सी प्रोग्रामिंग मुहावरे और डेवलपर अभ्यास
खोज…
तुलना शाब्दिक और चर
मान लीजिए कि आप कुछ चर के साथ मूल्य की तुलना कर रहे हैं
if ( i == 2) //Bad-way
{
doSomething;
}
अब मान लें कि आपने गलती की है ==
साथ =
। फिर इसे जानने के लिए आपका मीठा समय लगेगा।
if( 2 == i) //Good-way
{
doSomething;
}
फिर, यदि बराबर चिह्न गलती से छोड़ दिया जाता है, तो संकलक "शाब्दिक प्रयास करने के बारे में शिकायत करेगा"। दो चरों की तुलना करने पर यह आपकी रक्षा नहीं करेगा, लेकिन हर थोड़ी मदद करता है।
अधिक जानकारी के लिए यहाँ देखें ।
किसी फ़ंक्शन की पैरामीटर सूची को खाली न छोड़ें - शून्य का उपयोग करें
मान लीजिए कि आप एक ऐसा फंक्शन बना रहे हैं, जिसे कॉल करने पर कोई तर्क नहीं चाहिए और आपको इस दुविधा का सामना करना पड़ेगा कि आपको फ़ंक्शन प्रोटोटाइप और फ़ंक्शन परिभाषा में पैरामीटर सूची को कैसे परिभाषित करना चाहिए।
आपके पास प्रोटोटाइप और परिभाषा दोनों के लिए पैरामीटर सूची को खाली रखने का विकल्प है। जिससे उन्हें फंक्शन कॉल स्टेटमेंट जैसा ही लगेगा।
आपने कहीं पढ़ा कि कीवर्ड शून्य के उपयोग में से एक (उनमें से कुछ ही हैं), उन कार्यों की पैरामीटर सूची को परिभाषित करने के लिए है जो उनके कॉल में किसी भी तर्क को स्वीकार नहीं करते हैं। तो, यह भी एक विकल्प है।
तो, सही विकल्प कौन सा है?
उत्तर: कीवर्ड शून्य का उपयोग करना
सामान्य सलाह: यदि कोई भाषा किसी विशेष उद्देश्य के लिए उपयोग करने के लिए कुछ सुविधा प्रदान करती है, तो आप अपने कोड में इसका उपयोग करना बेहतर समझते हैं। उदाहरण के लिए, #define
मैक्रोज़ (कि एक और उदाहरण के लिए) के बजाय enum
एस का उपयोग करना।
C11 खंड 6.7.6.3 "फ़ंक्शन घोषणाकर्ता", अनुच्छेद 10, कहता है:
सूची में एकमात्र आइटम के रूप में प्रकार शून्य के अनाम पैरामीटर का विशेष मामला निर्दिष्ट करता है कि फ़ंक्शन में कोई पैरामीटर नहीं है।
उसी खंड के अनुच्छेद 14 में एकमात्र अंतर दिखता है:
… एक फ़ंक्शन घोषणा में एक खाली सूची जो उस फ़ंक्शन की परिभाषा का हिस्सा है, यह निर्दिष्ट करती है कि फ़ंक्शन का कोई पैरामीटर नहीं है। एक फ़ंक्शन घोषणा में खाली सूची जो उस फ़ंक्शन की परिभाषा का हिस्सा नहीं है, यह निर्दिष्ट करती है कि मापदंडों की संख्या या प्रकारों के बारे में कोई जानकारी नहीं दी गई है।
उपरोक्त सामान के लिए K & R (पृष्ठ- 72-73) द्वारा प्रदान की गई एक सरल व्याख्या:
इसके अलावा, अगर एक फ़ंक्शन घोषणा में तर्कों को शामिल नहीं किया जाता है, जैसे कि
double atof();
, इसका भी अर्थ यह निकाला जाता है किatof
के तर्कों के बारे में कुछ भी नहीं सोचाatof
; सभी पैरामीटर जाँच बंद है। खाली तर्क सूची के इस विशेष अर्थ का उद्देश्य पुराने सी कार्यक्रमों को नए संकलक के साथ संकलित करने की अनुमति देना है। लेकिन नए कार्यक्रमों के साथ इसका उपयोग करना एक बुरा विचार है। यदि फ़ंक्शन तर्क लेता है, तो उन्हें घोषित करें; यदि यह कोई तर्क नहीं लेता है, तोvoid
उपयोग करें।
तो यह है कि आपका फ़ंक्शन प्रोटोटाइप कैसा दिखना चाहिए:
int foo(void);
और यह है कि फ़ंक्शन की परिभाषा कैसे होनी चाहिए:
int foo(void)
{
...
<statements>
...
return 1;
}
उपरोक्त int foo()
का उपयोग करने का एक फायदा int foo()
उदाहरण के लिए कीवर्ड शून्य का उपयोग किए बिना int foo()
(जैसे कि कीवर्ड शून्य के बिना), यह है कि कंपाइलर त्रुटि का पता लगा सकता है यदि आप foo(42)
जैसे गलत बयान का उपयोग करके अपने फ़ंक्शन को कॉल करते हैं। यदि आप पैरामीटर सूची को खाली छोड़ते हैं तो इस तरह के फंक्शन कॉल स्टेटमेंट में कोई त्रुटि नहीं होगी। त्रुटि चुपचाप, अनिश्चित रूप से पास होगी और कोड अभी भी निष्पादित करेगा।
इसका मतलब यह भी है कि आपको main()
फ़ंक्शन को इस तरह परिभाषित करना चाहिए:
int main(void)
{
...
<statements>
...
return 0;
}
ध्यान दें कि भले ही एक खाली पैरामीटर सूची के साथ परिभाषित फ़ंक्शन कोई तर्क नहीं लेता है, यह फ़ंक्शन के लिए एक प्रोटोटाइप प्रदान नहीं करता है, इसलिए कंपाइलर शिकायत नहीं करेगा यदि फ़ंक्शन को बाद में तर्कों के साथ कहा जाता है। उदाहरण के लिए:
#include <stdio.h>
static void parameterless()
{
printf("%s called\n", __func__);
}
int main(void)
{
parameterless(3, "arguments", "provided");
return 0;
}
यदि उस कोड को फ़ाइल proto79.c
में सहेजा जाता है, तो इसे इस तरह से GCC (MacOS Sierra 10.12.5 पर प्रदर्शन के लिए इस्तेमाल किया जाने वाला संस्करण 7.1.0) के साथ यूनिक्स पर संकलित किया जा सकता है:
$ gcc -O3 -g -std=c11 -Wall -Wextra -Werror -Wmissing-prototypes -pedantic proto79.c -o proto79
$
यदि आप अधिक कड़े विकल्पों के साथ संकलन करते हैं, तो आपको त्रुटियाँ मिलती हैं:
$ gcc -O3 -g -std=c11 -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition -pedantic proto79.c -o proto79
proto79.c:3:13: error: function declaration isn’t a prototype [-Werror=strict-prototypes]
static void parameterless()
^~~~~~~~~~~~~
proto79.c: In function ‘parameterless’:
proto79.c:3:13: error: old-style function definition [-Werror=old-style-definition]
cc1: all warnings being treated as errors
$
यदि आप फ़ंक्शन को औपचारिक प्रोटोटाइप static void parameterless(void)
, तो संकलन त्रुटियां देता है:
$ gcc -O3 -g -std=c11 -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition -pedantic proto79.c -o proto79
proto79.c: In function ‘main’:
proto79.c:10:5: error: too many arguments to function ‘parameterless’
parameterless(3, "arguments", "provided");
^~~~~~~~~~~~~
proto79.c:3:13: note: declared here
static void parameterless(void)
^~~~~~~~~~~~~
$
नैतिक - हमेशा सुनिश्चित करें कि आपके पास प्रोटोटाइप हैं, और सुनिश्चित करें कि आपका कंपाइलर आपको बताता है कि आप नियमों का पालन नहीं कर रहे हैं।