2012-02-22 12 views
8

मैं एक सी फ़ाइल जो किसी विशेष हेडर फाइल की जरूरत है। यदि वह हेडर फ़ाइल मौजूद नहीं है, तो मैं प्रीप्रोसेसर को एक विशिष्ट चेतावनी जारी करना चाहता हूं। की तरह कुछ:क्या सी प्रीप्रोसेसर पता लगा सकता है कि कोई हेडर फ़ाइल नहीं मिल सकती है और एक विशिष्ट चेतावनी जारी कर सकती है?

#if !(#include <special.h>) 
#warning "Don't worry, you can fix this." 
#warning "You just need to update this other repo over here:" 
#endif 

इस सी पूर्वप्रक्रमक के साथ संभव है?

+0

यह एक makefile फ़ाइल में संभव है फोन करके पहले उपलब्ध है क्या करना है। –

+2

आप आमतौर पर है कि एक '।/Configure' स्क्रिप्ट के साथ की –

+0

संभव डुप्लिकेट [सी पूर्वप्रक्रमक अगर एक फ़ाइल मौजूद है बताने के लिए इस्तेमाल किया जा सकता है?] कर (http://stackoverflow.com/questions/142877/can-the-c -preprocessor-be-used-to-tell-if-a-file-exist) –

उत्तर

9

आपको हमेशा यह सुनिश्चित कर सकता है #define X मैक्रो, शामिल फ़ाइल से, है ... परिभाषित :)

+1

और यह कैसे मदद करता है? – asaelr

+0

@asaelr यह सुनिश्चित नहीं है कि यह सभी के लिए सच है, लेकिन मेरे निर्माण सेटअप में पीपी/सीसी बहादुरी से दबाएगी अगर उसे फ़ाइल शामिल नहीं मिल पाती है। तो '# शामिल ' 'द्वारा पीछा #ifndef __SPECIAL_H__' मुझे –

7

नहीं, यह संभव नहीं है। आप जो भी कर सकते हैं वह हैडर को #include करने का प्रयास करें, और यदि यह अस्तित्व में नहीं है, तो संकलक आपको एक त्रुटि देगा।

एक वैकल्पिक GNU autoconf जैसे किसी उपकरण का उपयोग करने के लिए किया जाएगा। autoconf configure नामक एक शेल स्क्रिप्ट उत्पन्न करता है जो आपके निर्माण तंत्र का विश्लेषण करता है और यह निर्धारित करता है कि आपके पास कुछ हेडर फाइलें इंस्टॉल हैं या नहीं, और यह उस हेडर फ़ाइल को उत्पन्न करती है जिसमें उस जानकारी को इंगित करने वाले मैक्रोज़ शामिल हैं।

उदाहरण के लिए, यह HAVE_SYS_TIME_H परिभाषित कर सकता है, तो अपने निर्माण प्रणाली हैडर <sys/time.h> भी शामिल है, इसलिए इस तरह के रूप में आप तो कोड लिख सकते हैं:

#if HAVE_SYS_TIME_H 
#include <sys/time.h> 
#else 
#warning "Don't worry, you can fix this." 
#endif 
+1

Yepp के लिए काम करता है, लेकिन इसे और अधिक समझ में आता है तो कॉन्फ़िगर स्क्रिप्ट से चेतावनी/त्रुटि जारी करने के लिए ... –

-3

आप सभी की जरूरत के लिए एक चेतावनी है कि हेडर फाइल वहाँ नहीं है (और कोई कस्टम कोड नहीं), तो अधिकांश कंपाइलर्स आपको पहले से ही एक देंगे।

$ LC_MESSAGES=en_US gcc -c bar.c 
bar.c:1:17: fatal error: foo.h: No such file or directory 
compilation terminated. 
+6

, एक गंभीर त्रुटि और एक चेतावनी काफी हैं तुम्हारे लिए एक ही बात है, है ना? –

12

मैं जानता हूँ कि यह एक पुराने सवाल है, लेकिन मैं भी यह करने के लिए एक तरह से की जरूरत है और जब मैं इन उत्तर पढ़ मैं निराश था। ऐसा लगता है कि बजना एक अच्छा __has_include("header name") निर्देश है कि दोषरहित काम करता है कि तुम क्या जरूरत है :) हो सकता है कि आप जाँच करना चाहते हैं, तो निर्देश #if defined(__has_include)

+5

[जीसीसी में यह भी है] (https://gcc.gnu.org/gcc-5/changes.html)। यह जीसीसी 5 कहता है, लेकिन 4.9 मेरे लिए ठीक काम करता प्रतीत होता है। –

संबंधित मुद्दे