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.
Voi: Tại sao lại sử dụng macro? – user4581301
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
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