मैं एक 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
Rocket 18 फरवरी 2021, 13:06
1
आपको प्रीप्रोसेसर निर्देशों जैसे #ifdef आदि के बारे में पढ़ना चाहिए और फिर आपको अपने कंपाइलर को संबंधित मैक्रो प्रदान करने की आवश्यकता है। कई कंपाइलरों के लिए जो -D... विकल्प के माध्यम से किया जाता है। अपने मेकफ़ाइल में सी कंपाइलर के लिए बस इसे अपने मौजूदा झंडे में जोड़ें।
 – 
Gerhardh
18 फरवरी 2021, 13:08

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
2
David Ranieri 18 फरवरी 2021, 21:38