2012-12-18 8 views
5

मैं एक एम्बेडेड गिरी स्रोत के साथ काम कर रहा था जब मैं कुछ इस तरह देखा में: औरसी संकलन त्रुटि: आवारा '##' कार्यक्रम

#define OMAP_SYS_TIMER_INIT(name, clkev_nr, clkev_src, clksrc_nr, clksrc_src) \ 
static void __init omap##name##_timer_init(void)        \ 
{                    \ 
    omap2_gp_clockevent_init((clkev_nr), clkev_src);       \ 
    omap2_gp_clocksource_init((clksrc_nr), clksrc_src);      \ 
} 

जब मैं एक प्रोग्राम है जो इस ## बात के लिए इस्तेमाल किया बनाने के लिए tryed (कि मुझे नाम पता नहीं है) यह देखने के लिए कि यह वास्तव में क्या कर सकता है मुझे इसे काम करने के लिए नहीं मिला। नीचे मैंने अपने कार्य का परीक्षण करने के लिए किया है। मैं तो बस देखना चाहते हैं ## के अंदर तर्क शाब्दिक है या नहीं, लेकिन कुछ स्पष्ट रूप से यह संकलन करने के लिए मेरे कोड में याद आ रही है ...

#include <stdio.h> 
#include <stdlib.h> 

#define DEFINE_1 2 
#define DEFINE_2 4 
#define DEFINE_3 6 

#define DEFINE_i 9 

int main(void) 
{ 
    int i; 
    for(i=1;i<4;i++) { 
    printf("numero %d = %d\n",i,DEFINE_##i##); 
    } 
    return EXIT_SUCCESS; 
} 

जीसीसी के उत्पादन होता है:

test.c: In function ‘main’: 
test.c:14:5: error: stray ‘##’ in program 
test.c:14:33: error: ‘DEFINE_’ undeclared (first use in this function) 
test.c:14:33: note: each undeclared identifier is reported only once for each function it appears in 
test.c:14:42: error: expected ‘)’ before ‘i’ 
test.c:14:42: error: stray ‘##’ in program 

कोई भी जानता है कि क्या गलत है? धन्यवाद

+1

प्रीप्रोसेसर के पास कोई संकेत नहीं है कि 'i' क्या है और इसके साथ DEFINE_ को कैसे सम्मिलित किया जाए - प्रीप्रोसेसर ने अपना काम पूरा करने के बाद ही इसे संकलन के बाद और बाद में पहचाना जाएगा। तो आप प्रोग्राम चर का उपयोग ## concatenation के टुकड़ों के रूप में नहीं कर सकते ... –

उत्तर

5

यह सी प्रीप्रोसेसर के लिए token concatenation ऑपरेटर है। आपके उदाहरण को संकलित नहीं करने का कारण यह है कि आप मैक्रो के भीतर ## ऑपरेटर का उपयोग नहीं कर रहे हैं (यानी #define कथन)।

कुछ और जानकारी के साथ यहां another post है।

2

आप केवल प्रीप्रोसेसर निर्देशों में ## का उपयोग कर सकते हैं।

2

## is used for concatenation in C preprocessor macros

आपके उदाहरण में, विचार फ़ंक्शन नाम के साथ ओमैप को जोड़ना है। उदाहरण

OMAP_SYS_TIMER_INIT (foo, ...) के लिए

omapfoo नाम के एक समारोह का निर्माण करेगा।

1

शायद आप जो करने का प्रयास कर रहे हैं वह है, DEFINE_ और (i = 1) "DEFINE_1" बनाने के लिए ## का उपयोग करके संयोजित होगा और यह आपके मैक्रो मूल्य 2 के साथ होगा। ठीक है? यदि ऐसा है, तो समस्या यह है कि, मैक्रो प्रीप्रोसेसर है और मूल्य निष्पादन से पहले लाइन में लाया जाएगा। तो यह DEFINE_i की तलाश में है और ऐसा कोई मैक्रो नहीं है। इसे ध्यान में रखें I = 1,2,3 .. और इतने पर रनटाइम के दौरान।

2

## टोकन पेस्टिंग ऑपरेटर है और आप इसे केवल मैक्रो परिभाषा में उपयोग कर सकते हैं। आप इसे मैक्रो परिभाषा के बाहर उपयोग नहीं कर सकते हैं।

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