2016-05-10 37 views
6

Lütfen bu sorunu çözmeme yardımcı olun. Bu, satır numarasını, dosya adını ve C dilinde var hatalarını almak için örnek koddur. Bunu çalıştırmayı denediğimde bazı hatalar aldım. Bunu yapmanın birçok yolu olduğundan eminim. Ama bazı işlevleri elde etmek için mevcut kodu kullanmalıyım. Herhangi bir yardım veya öneri çok takdir edilecektir. Makro içinde makro içinde C

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

#define MY_MACRO1(fmt, args...)    \ 
{            \ 
    char buf_d[1024];      \ 
    MY_MACRO2(__FILE__, __LINE__,call_func(buf_d,sizeof(buf_d),fmt,##args)); \ 
} 

#define MY_MACRO2(__FILE__, __LINE__,fmt, ...) printf("%s : %d -> %s : \n",__FILE__, __LINE__, __VA_ARGS__); 

char * call_func(char *buf_t, size_t size, const char *fmt, ...) 
{ 
    va_list ap; 
    va_start(ap,fmt); 
    vsnprintf(buf_t, size, fmt, ap); 
    va_end(ap); 
    return buf_t; 
} 


int main() 
{ 
    printf("\n Now I am printintg macro....\n"); 
    MY_MACRO1("Macro is working fine..\n"); 
    return 0; 
} 

Çıktı:

makro genişleme bulabilirsiniz. Son argüman makroda (func dönüş değeri) eksik.

char buf_d[1024]; 
printf("%s : %d -> %s : \n","file.c",35,);; 

hatası:

file.c:35:83: error: expected expression 
{ char buf_d[1024]; printf("%s : %d -> %s : \n","file.c", 35,);; }; 
                  ^

1 hata oluşturulur.

+3

Fil: Neden bir makro kullanıyorsunuz? – user4581301

+3

Bu C ve C++ neden çift olarak etiketlensin? Soruda belirtmediğiniz bir derleyicinin standart olmayan bir derleyici uzantısı kullanıyorsunuz. Geçerli C olmak zorunda mı? Geçerli C++ olmak zorunda mı? Belirli bir derleyiciniz için kabul edilebilir olmak zorunda mı? Üçü de size farklı cevaplar verecektir. Ve neden yeryüzünde '__FILE__' ve' __LINE__' makro parametreleri olarak yeniden tanımlamayı seçiyor ?! – hvd

+0

IIRC 'fmt, args ...' daha sonra bir ', ## args' tarafından izlenen bir taşınabilir olmayan uzantısıdır. 'Fmt, args ... 'yerine' '' ve '__VA_ARGS__' yerine' 'fmt, ## args''nı kullanabilirsiniz. – technosaurus

cevap

1

, ...'u kullandığınızda, bu sizin durumunuzda olmayan bir argüman sağlamalısınız demektir. Sadece argüman listesini isimlendirerek ve önişlemcinin virgülle başa çıkmasını istediğinizde değiştirebilirsiniz:

#define MY_MACRO1(fmt, args...)    \ 
{            \ 
    char buf_d[1024];      \ 
    MY_MACRO2(__FILE__, __LINE__,call_func(buf_d,sizeof(buf_d),fmt,##args)); \ 
} 

#define MY_MACRO2(F,L,fmt,args...) printf("%s : %d -> %s : \n",F, L, fmt, ##args) 
+0

test_macro.c: 30: 2: uyarı: veri argümanlarından daha fazla '%' dönüşüm [-Wformat] Sanırım haklısınız Jean.Ama denediğimde uyarı aldım .. İstenilen string yerine biraz çöp basıyor..test_macro.c: 20: 69: not: makrodan genişletildi 'DEBUG_APMD_V2' #define DEBUG_APMD_V2 (dosya, satır, fmt, args .. .) printf ("% s:% d ->% s: \ n", dosya, satır, ## args); ~^ 1 uyarı oluşturuldu. – Rock26

+0

Örneğiniz benim için önerdiğim gibi değiştirilmiş, gerçek durumunuz biraz farklı olabilir mi? –

+2

Üç noktadan önce virgül içermeyen gösterimin bir GCC (ve muhtemelen GCC'ye uyumluluk-GCC ile) uzantısı olduğunu unutmayın. –

2

Ne dağınıklık! eşyalarını temizlemek edelim:

kodu:

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


#define DEBUG_MSG(_msg, ...) do {print_debug_msg(__FILE__, __LINE__, __FUNCTION__, _msg, ## __VA_ARGS__); }while(0) 


void print_debug_msg(const char * module, int line, const char * func, const char * fmt, ...) 
{ 
    va_list va; 
    char buf[ 1024 ] = {0}; 

    va_start(va, fmt); 
    vsnprintf(buf, sizeof(buf), fmt, va); 
    va_end(va); 

    printf("%s:%d - %s() - %s\n", module, line, func, buf); 
} 


int myfunc(const char * msg) 
{ 
    DEBUG_MSG("Message: %s", msg); 

    return 0; 
} 


int main(int argc, char * argv[]) 
{ 
    DEBUG_MSG("The quick brown fox jumps over the lazy dog."); 

    DEBUG_MSG("Pack my box with five dozen liquor jugs."); 

    myfunc("How vexingly quick daft zebras jump"); 

    myfunc("The five boxing wizards jump quickly."); 

    return 0; 
} 

/* eof */ 

Derleme:

$ gcc -Wall macro.c -o macro 

Test:

$ ./macro 
macro.c:32 - main() - The quick brown fox jumps over the lazy dog. 
macro.c:34 - main() - Pack my box with five dozen liquor jugs. 
macro.c:24 - myfunc() - Message: How vexingly quick daft zebras jump 
macro.c:24 - myfunc() - Message: The five boxing wizards jump quickly. 

Referanslar:

1) Recommended C Style and Coding Standards (Macros)

2) GCC Manual - Standard Predefined Macros

Umut Ediyor!