[英]How to pass variable arguments va_list from managed C++ to C#?
我正在開發C ++ / CLI庫,並且具有以下類:
public ref class AbstractClassA abstract{
protected:
// signature can be changed by me (method will be overriden in C#)
virtual void write(String ^ str, String ^ format, ...array<Object^> ^args) = 0;
internal:
// signature cannot be changed by me
void internWrite(const char *str, const char *format, va_list args){
write(gcnew String(str), gcnew String(format), ???)}
};
該方法“internWrite”必須調用方法“ 了methodA”,但我無法找到如何將“va_list的 ”參數轉換為托管數組。 我發現了一些有趣的帖子[1],[2],但提到的解決方案要求具有' va_list '長度。 我沒有這些信息,因此無法更改' internWrite '的簽名。
我可以更改' write '的簽名。
如何將va_list轉換為托管變量args數組?
[編輯]方法' internWrite '的注釋提到:
-format + args:格式化打印,語法與printf函數相同
也許我需要使用參數' format '來獲取va_list的長度(如使用變量列表參數時提到的va_list的長度? )。 但是我該怎么辦呢? printf命令如何執行?
[編輯]假設format + args具有與printf相同的語法,我創建了一種方法來獲取agrs的長度(以count%為單位)。 這是我目前的代碼:
void write(char *format, va_list args){
String^ mgFormat = gcnew String(format);
int nbArgs = sizeOfArgs(format);
array<Object^>^ mgArgs = gcnew array<Object^>(nbArgs);
va_start(args, format);
for (int _i = 0; _i < nbArgs; ++_i){
mgArgs[_i] = va_arg(args, int); // not sure the type is int ... how to know ?
}
va_end(args);
internWrite(mgFormat, mgArgs);
}
但是現在我被困在將每個arg對象添加到數組的過程中,因為宏'va_arg'需要當前參數的類型。 我沒有此信息。 如何迭代va_list並填充托管數組?
[1] 如何使用C ++ / CLI包裝器將變量參數從托管傳遞到非托管?
[2] 從非托管代碼中調用帶有可變數量參數的.NET函數
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.