2016-05-10 14 views
6

Hãy giúp tôi giải quyết vấn đề này. Đây là mẫu mã để có được số dòng, tên tập tin và var args trong C. Khi tôi đã cố gắng để chạy này, tôi đã nhận một số lỗi. Tôi chắc chắn có nhiều cách để làm điều này. Nhưng tôi phải sử dụng mã hiện có để đạt được một số chức năng. Bất kỳ trợ giúp hoặc gợi ý nào sẽ được đánh giá cao.Macro trong macro trong 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; 
} 

Output:

Hãy tìm mở rộng vĩ mô. Đối số cuối cùng trong macro (giá trị trả về func) bị thiếu.

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

Lỗi:

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

1 lỗi được tạo ra.

+3

Voi: Tại sao lại sử dụng macro? – user4581301

+3

Tại sao phải gắn thẻ kép C và C++ này khi nó không? Bạn đang sử dụng phần mở rộng trình biên dịch không chuẩn của trình biên dịch mà bạn chưa chỉ định trong câu hỏi. Nó có phải trở thành C hợp lệ không? Nó có phải trở thành C++ hợp lệ không? Liệu nó phải trở thành chấp nhận được đối với trình biên dịch cụ thể của bạn? Cả ba sẽ cho bạn những câu trả lời khác nhau. Và tại sao trên trái đất lại chọn '__FILE__' và' __LINE__' làm tham số macro ?! – hvd

+0

IIRC 'fmt, args ...' sau đó theo sau là một ', ## args' là một phần mở rộng không di động. Bạn có thể sử dụng '...' thay cho 'fmt, args ...' và '__VA_ARGS__' thay cho' fmt, ## args' – technosaurus

Trả lời

1

Khi bạn sử dụng , ... đó có nghĩa là bạn phải cung cấp một cuộc tranh cãi, mà không phải là trường hợp của bạn. Bạn chỉ có thể sửa đổi macro của mình bằng cách đặt tên cho danh sách đối số và để trình xử lý trước tránh được dấu phẩy nếu cần:

#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: cảnh báo: nhiều chuyển đổi '%' hơn đối số dữ liệu [-Wformat] Tôi nghĩ bạn đúng là Jean.Nhưng khi tôi đã cố gắng tôi nhận được cảnh báo sau đây .. Nó in một số rác thay vì mong muốn string..test_macro.c: 20: 69: lưu ý: mở rộng từ vĩ mô 'DEBUG_APMD_V2' # define DEBUG_APMD_V2 (file, line, fmt, args .. .) printf ("% s:% d ->% s: \ n", tệp, dòng, ## args); ~^ 1 cảnh báo được tạo. – Rock26

+0

Ví dụ của bạn được sửa đổi như tôi đã đề xuất phù hợp với tôi, có thể tình hình thực tế của bạn hơi khác một chút? –

+2

Lưu ý rằng ký hiệu không có dấu phẩy trước dấu ba chấm là phần mở rộng GCC (và có thể là Clang-for-compatibility-with-GCC). –

2

Thật là một mớ hỗn độn! Hãy làm sạch điều:

Mã:

#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 */ 

Biên dịch:

$ gcc -Wall macro.c -o macro 

Thử nghiệm:

$ ./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. 

Tài liệu tham khảo:

1) Recommended C Style and Coding Standards (Macros)

2) GCC Manual - Standard Predefined Macros

Hy vọng nó sẽ giúp!