Tôi đang cố gắng chuyển đổi một số mã để nó biên dịch trên gcc quá (ngay bây giờ, nó chỉ biên dịch trên MSVC).Làm thế nào để tạo một va_list trên GCC?
Mã tôi bị kẹt ở trong chức năng định dạng giả chấp nhận như nhập chuỗi định dạng và không hoặc nhiều đối số (const char *format, ...
). Sau đó, nó sẽ xử lý một số số của trình giữ chỗ tiêu thụ một số đối số của đối số và chuyển phần còn lại thành vsprintf
cùng với một va_list mới được tạo động.
Đây là mã thực tế để tạo mới va_list
:
char *new_args = (char *) malloc(sum);
char *n = new_args;
for(int i = 0; i < nArgs; i++)
{
int j = order[i];
int len = _getlen(types[j]);
memcpy(n, args + cumulOffsets[j], len);
n += len;
}
vsprintf(buffer, sFormat.c_str(), new_args);
Trong phòng của tôi, tôi đã không và sẽ không bao giờ viết mã này. Trong thực tế, tôi nghĩ rằng đó là một trong những điều khó khăn nhất mà tôi từng thấy trong suốt cuộc đời của mình.
Tuy nhiên, chức năng này rất phức tạp, rất cũ và rất quan trọng. Nó cũng đã không được sửa đổi trong nhiều năm (tốt, ngoại trừ bây giờ) vì vậy trong khi tôi muốn viết lại nó từ đầu tôi không thể biện minh cho thời gian nó sẽ mất cộng với các lỗi nó sẽ giới thiệu.
Vì vậy, tôi cần một cách để làm điều này cùng trên GCC .. Nhưng có một va_list
không phải là một char *
vì vậy tôi nhận được:
error: ISO C++ forbids casting to an array type '__va_list_tag [1]'
xem xét sử dụng libffi (http://sourceware.org/libffi/) – Christoph
Tôi cho rằng vấn đề này không hòa tan được. Nó không thể tự động xây dựng một va_list trong C/C++ di động. Thêm vào đó vấn đề với __builtin_va_list không được định nghĩa trong bất kỳ tập tin tiêu đề nào, và điều đó trở nên gấp đôi không thể. – TonyK
Với mã hoàn chỉnh hơn cho hàm, nó có thể giúp bạn. Tuy nhiên, như TonyK đã nói, không có một cách di động để tạo ra một va_list. –