Tôi có khoảng 30 hàm variadic. Mỗi người chấp nhận một con đường như là đối số cuối cùng, ví dụ .:Chuyển dấu chấm lửng sang một hàm variadic khác
bool do_foo(struct *f, int q, const char *fmt, ...)
Trong mỗi chức năng, tôi phải kiểm tra xem các định dạng mở rộng là ít hơn hoặc bằng một kích thước nhất định. Vì vậy, tôi thấy bản thân mình sao chép/dán cùng một đoạn mã để kiểm tra xem có bao nhiêu ký tự vsnprintf()
không in, thiết lập errno
cho phù hợp và được bảo lãnh.
Những gì tôi muốn làm là viết một hàm để làm điều này, sẽ trả về một chuỗi được phân bổ tĩnh (mở rộng) được biết là kích thước an toàn hoặc chuỗi mới được khởi tạo thất bại, có thể được kiểm tra với NULL . Các kiểm tra cũng phải xác định nếu chuỗi là một đường dẫn tuyệt đối hoặc tương đối, mà ảnh hưởng đến kích thước an toàn của chuỗi. Đó là rất nhiều mã trùng lặp và nó bắt đầu có mùi.
Có cách nào để tôi có thể chuyển nội dung của elipsis từ chức năng của tôi vào một chức năng khác không? Hoặc tôi có phải gọi va_start()
trước tiên, sau đó vượt qua va_list
đến chức năng trợ giúp không?
Edit:
Tôi không ở tất cả chứ không phải đi qua các va_list
đến helper, tôi chỉ muốn chắc chắn rằng không có gì khác tồn tại. Dường như với tôi trình biên dịch hiểu nơi các đối số variadic bắt đầu, vì vậy tôi đã chỉ tò mò nếu tôi có thể nói với nó để vượt qua chúng cùng.
Có bất kỳ lý do bạn xấu để đi qua các va_list đến helper? – ojblass
Tôi đã phải làm những điều tương tự nhưng phải loại bỏ một vài trong số các args ... không phải là mã dễ chịu để duy trì. – ojblass