क्यों आप बस अलग ढंग से कि मैक्रो के आधार पर ASSERT
परिभाषित नहीं करते?
#ifdef MACRO
#define ASSERT(NAME, TEST) \
do { \
printf("Assert failed"); \
} while(0)
#else
#define ASSERT(NAME, TEST) {}
#endif
का उपयोग सी सशर्त में तय पूर्वप्रक्रमक मूल्यों से परहेज किया जाना चाहिए - यकीन है कि संकलक मृत कोड बाहर का अनुकूलन करना चाहिए, लेकिन क्यों कि पर भरोसा करते हैं जब आप अनिवार्य रूप से वास्तविक सी कोड निकाल सकते हैं?
संपादित करें:
नहीं है बल्कि एक बदसूरत है कि आप उपयोग करने में सक्षम हो सकता है मैक्रो तर्क stringification शामिल चाल:
#include <string.h>
#include <stdio.h>
#define X
#define ERROR_(NAME, TEXT) \
if (strcmp("", #NAME) == 0) \
printf("%s\n", TEXT)
#define ERROR(n, t) ERROR_(n, t)
int main() {
ERROR(X, "Error: X");
ERROR(Y, "Error: Y");
return 0;
}
यह आउटपुट:
$ ./test
Error: X
मूलतः यह का उपयोग करता है तथ्य यह है कि जब एक प्रीप्रोसेसर टोकन को मा के रूप में परिभाषित नहीं किया गया है सीआरओ, यह खुद के लिए फैलता है। जब, दूसरे हाथ पर, यह है परिभाषित यह या तो एक खाली स्ट्रिंग, या इसकी परिभाषा को विस्तृत करता है। जब तक अपने मैक्रो में से एक एक परिभाषा के रूप में अपने स्वयं के नाम है, इस हैक काम करना चाहिए।
अस्वीकरण: अपने जोखिम पर इस का प्रयोग करें!
(... क्योंकि मैं सबसे निश्चित रूप से इसका इस्तेमाल नहीं होगा!)
संपादित करें 2:
उपरोक्त कार्यक्रम के लिए gcc -O0 -S
के विधानसभा उत्पादन होता है:
.file "test.c"
.section .rodata
.LC0:
.string "Error: X"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
movq %rsp, %rbp
.cfi_offset 6, -16
.cfi_def_cfa_register 6
movl $.LC0, %edi
call puts
movl $0, %eax
leave
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (GNU) 4.4.3"
.section .note.GNU-stack,"",@progbits
भी अनुकूलन के साथ, जीसीसी इस कार्यक्रम को एक puts()
कॉल पर कम कर देता है।इस कार्यक्रम के बिल्कुल वैसा ही विधानसभा उत्पादन का उत्पादन:
#include <stdio.h>
int main() {
puts("Error: X");
return 0;
}
इसलिए, आप शायद अपने संकलक और किसी भी अनुकूलन के आधार पर किसी भी प्रदर्शन के मुद्दों के लिए, नहीं जा रहे हैं ...
के संभावित डुप्लिकेट [मैक्रो निर्भर मैक्रो] (http://stackoverflow.com/questions/4927976/macro-dependent-macro) – kennytm