मैं एक C program
विकसित कर रहा हूं जो 2 फ़ंक्शन, func1()
और func2()
को कॉल करता है।
यहाँ कोड है
void func1(void){/*...*/}
void func2(void){/*...*/}
int main(){
func1();
func2();
return 0;
}
क्या कोई तरीका है कि जब मैं compile
प्रोग्राम make
और एक certain flag
का उपयोग करता हूं, तो यह सिर्फ func1()
को निष्पादित करता है और यदि मैं किसी अन्य ध्वज का उपयोग करके संकलित करता हूं तो यह केवल func2()
?
ऐसा makefile
कैसे बनाएं? क्या कोई मुझे मेकफ़ाइल प्रदान कर सकता है जो यह काम करता है?
1 उत्तर
आप संकलक के -D
ध्वज का उपयोग कर सकते हैं:
cc -o demo demo.c -Dfunc=func1
फिर
#include <stdio.h>
void func1(void) { puts("1"); }
void func2(void) { puts("2"); }
int main(void)
{
func();
return 0;
}
आउटपुट:
1
आप फ़ंक्शन को make
के तर्क के रूप में भी पास कर सकते हैं:
CC = gcc
CFLAGS = -std=c11 -Wpedantic -Wall
action: demo.c
$(CC) $(CFLAGS) demo.c -o demo -Dfunc=$(argument)
clean:
rm -f demo
make
का उपयोग करके कॉल करें:
make action argument=func1
या
make action argument=func2
लेकिन अगर आप वास्तव में ऐसा करना चाहते हैं:
int main(){
func1();
func2();
main
के अंदर दोनों कार्यों को कॉल करें, आपको एक और दृष्टिकोण का उपयोग करना चाहिए (हालांकि यह समाधान मुझे काफी चिपचिपा लगता है):
#include <stdio.h>
void func0(void) { /* do nothing */ }
void func1(void) { puts("1"); }
void func2(void) { puts("2"); }
#ifdef delete_func1
#define func1 func0
#endif
#ifdef delete_func2
#define func2 func0
#endif
int main(void)
{
func1();
func2();
return 0;
}
का उपयोग कर संकलित करें:
cc -o demo demo.c -Ddelete_func1
या
cc -o demo demo.c -Ddelete_func2
तो Makefile
इस तरह दिखना चाहिए:
CC = gcc
CFLAGS = -std=c11 -Wpedantic -Wall
func1: demo.c
$(CC) $(CFLAGS) demo.c -o demo -Ddelete_func2
func2: demo.c
$(CC) $(CFLAGS) demo.c -o demo -Ddelete_func1
clean:
rm -f demo
इसका उपयोग करके कॉल करें:
make func1
या
make func2
आप दो बार -D
का उपयोग करके दोनों कार्यों को हटा सकते हैं:
cc -o demo demo.c -Ddelete_func1 -Ddelete_func2
#ifdef
आदि के बारे में पढ़ना चाहिए और फिर आपको अपने कंपाइलर को संबंधित मैक्रो प्रदान करने की आवश्यकता है। कई कंपाइलरों के लिए जो-D...
विकल्प के माध्यम से किया जाता है। अपने मेकफ़ाइल में सी कंपाइलर के लिए बस इसे अपने मौजूदा झंडे में जोड़ें।