2013-03-10 33 views
6

Tôi muốn vượt qua NULL đến param thứ 4 của hàm sau:Làm cách nào để truyền NULL vào tham số hàm va_list?

bool CCMenuItemToggle :: initWithTarget (CCObject * mục tiêu, SEL_MenuHandler selector, CCMenuItem * mục, args va_list);

như thế này:

CCMenuItemToggle::initWithTarget(this, menu_selector(GOSound::toggleButtonCallback), NULL, NULL);

Đó là ok khi tôi xây dựng nó trong XCode (clang3.1). Nhưng khi tôi cổng mã để ndk android (g ++ 4.7), nó thất bại trong việc biên dịch:

no viable conversion from 'int' to 'va_list' (aka '__builtin_va_list')

Làm thế nào tôi nên đối phó với nó?

Trả lời

10

Tôi giả sử mã của bạn sẽ hoạt động nếu bạn chỉ sử dụng số trống va_list thay vì NULL.

CCMenuItemToggle::initWithTarget(this, menu_selector(GOSound::toggleButtonCallback) 
           , NULL, va_list()); 

Chỉnh sửa: Có thể giải pháp thay thế này hoạt động với cả hai trình biên dịch.

va_list empty_va_list; 
CCMenuItemToggle::initWithTarget(this, menu_selector(GOSound::toggleButtonCallback) 
           , NULL, empty_va_list); 
+1

Tôi chỉ nhận thấy rằng tôi đã thử nghiệm giải pháp của bạn với ndk (clang3.1). Khi tôi chuyển trở lại ndk (g ++ 4.7), nó báo cáo lỗi: 'lỗi trình biên dịch nội bộ: trong build_zero_init_1, tại cp/init.c: 280' – smilingpoplar

+0

Tôi không nghĩ rằng tôi chịu trách nhiệm về điều đó. Câu trả lời vẫn chính xác. Trình biên dịch bị hỏng. Có lẽ nó giúp khai báo một biến befor các cuộc gọi và vượt qua biến. Xem chỉnh sửa ở trên. – Thomas

+0

Cool, workaround sau này hoạt động cho cả hai trình biên dịch. : D – smilingpoplar

0

Tôi thấy câu hỏi này đã được trả lời nhưng không phải là tiêu chuẩn. đoạn mã sau sẽ thông qua một lỗi thời gian chạy trong Visual Studios; tuy nhiên, nó hoạt động tốt với g ++.

va_list empty_va_list; 
CCMenuItemToggle::initWithTarget(this, menu_selector(GOSound::toggleButtonCallback), NULL, empty_va_list); 

Một giải pháp tốt hơn là tạo một vài hàm trợ giúp để xây dựng một va_list trống.

va_list CCMenuItemToggle::createEmptyVa_list() 
{ 
    return doCreateEmptyVa_list(0); 
} 

va_list CCMenuItemToggle::doCreateEmptyVa_list(int i,...) 
{ 
    va_list vl; 
    va_start(vl,i); 
    return vl; 
} 

làm cho doCreateEmptyVa_list tin và sau đó khi bạn gọi chức năng của bạn gọi

CCMenuItemToggle::initWithTarget(this, menu_selector(GOSound::toggleButtonCallback), NULL, CreateEmptyVa_list()); 
0

Bạn không thể vượt qua NULL như là đối số thứ tư của chức năng của bạn. Hàm đó yêu cầu đối số va_list. NULL trong trường hợp chung không phải là bộ khởi tạo hợp lệ cho đối tượng va_list. Vì vậy, câu trả lời cho câu hỏi của bạn là: điều đó là không thể.

Cách bạn xử lý tùy thuộc vào những gì bạn đang cố gắng thực hiện.

Các vấn đề liên quan