मैंने इसके लिए एक महान समाधान के बारे में सोचा है जो स्रोत और हेडर दोनों फ़ाइलों के साथ काम करता है, बहुत कुशल है और सभी प्लेटफार्मों में बिना कंपाइलर-विशिष्ट एक्सटेंशन के संकलन के समय पर काम करता है। यह समाधान आपकी परियोजना की सापेक्ष निर्देशिका संरचना को भी संरक्षित करता है, इसलिए आप जानते हैं कि फ़ाइल किस फ़ोल्डर में है, और केवल आपकी परियोजना की जड़ के सापेक्ष है।
विचार यह है कि अपने निर्माण उपकरण के साथ स्रोत निर्देशिका का आकार प्राप्त करें और बस इसे जोड़ें __FILE__ मैक्रो में , निर्देशिका को पूरी तरह से हटा दें और केवल फ़ाइल नाम को अपने स्रोत निर्देशिका में दिखाना शुरू करें।
निम्नलिखित उदाहरण को CMake का उपयोग करके कार्यान्वित किया गया है, लेकिन ऐसा कोई कारण नहीं है कि यह किसी अन्य बिल्ड टूल के साथ काम नहीं करेगा, क्योंकि चाल बहुत सरल है।
CMakeLists.txt फ़ाइल पर, एक मैक्रो को परिभाषित करें जो CMake पर आपकी परियोजना के पथ की लंबाई है:
# The additional / is important to remove the last character from the path.
# Note that it does not matter if the OS uses / or \, because we are only
# saving the path size.
string(LENGTH "${CMAKE_SOURCE_DIR}/" SOURCE_PATH_SIZE)
add_definitions("-DSOURCE_PATH_SIZE=${SOURCE_PATH_SIZE}")
अपने स्रोत कोड पर, __FILENAME__उस मैक्रो को परिभाषित करें जो मैक्रो में स्रोत पथ का आकार जोड़ता है __FILE__:
#define __FILENAME__ (__FILE__ + SOURCE_PATH_SIZE)
तो बस मैक्रो के बजाय इस नए मैक्रो का उपयोग करें __FILE__। यह काम करता है क्योंकि __FILE__पथ हमेशा आपके सीएमके स्रोत के मार्ग से शुरू होगा। इसे __FILE__स्ट्रिंग से हटाने से प्रीप्रोसेसर सही फ़ाइल नाम निर्दिष्ट करने का ध्यान रखेगा और यह सब आपके सीएमके प्रोजेक्ट की जड़ के सापेक्ष होगा।
यदि आप प्रदर्शन की परवाह करते हैं, तो यह उपयोग करने में उतना ही कुशल है __FILE__, क्योंकि दोनों __FILE__औरSOURCE_PATH_SIZE इसलिए यह संकलक द्वारा दूर अनुकूलित किया जा सकता है संकलन समय स्थिरांक में जाना जाता है,।
एकमात्र स्थान जहां यह विफल होगा यदि आप इसे उत्पन्न फ़ाइलों पर उपयोग कर रहे हैं और वे एक ऑफ-सोर्स बिल्ड फ़ोल्डर पर हैं। तब आपको संभवतः CMAKE_BUILD_DIRचर का उपयोग करके एक और मैक्रो बनाना होगा CMAKE_SOURCE_DIR।