我有一個C編程問題:我想寫一個帶有可變參數列表的函數,其中每個參數的具體類型都不知道 - 僅以字節爲單位。這意味着,如果我想獲得一個int參數,我(在某個地方之前)定義:將會有一個sizeof(int)的參數,用一個回調函數xyz處理。帶有未知類型名稱的va_list - 只知道字節大小!
我的變量參數函數現在應該從其調用收集所有信息,真正的數據類型特定操作(也可以是用戶定義的數據類型)只能通過回調函數進行處理。
在標準的va_arg函數中,不可能說「給我一個來自我的參數列表的X字節值」,所以我想這樣做。我的數據類型在這種情況下是雙倍的,但它可以是任何其他數量的字節(甚至可變的)。
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
int fn(int anz, ...)
{
char* p;
int i;
int j;
va_list args;
char* val;
char* valp;
int size = sizeof(double);
va_start(args, anz);
val = malloc(size);
for(i = 0; i < anz; i++)
{
memcpy(val, args, size);
args += size;
printf("%lf\n", *((double*)val));
}
va_end(args);
}
int main()
{
fn(1, (double)234.2);
fn(3, (double)1234.567, (double)8910.111213, (double)1415.161718);
return 0;
}
它適用於我在Linux(gcc)下。但我現在的問題是:這真的是可移植的嗎?還是會在其他系統和編譯器下失敗?
我的另一種方法是更換
memcpy(val, args, size);
args += size;
與
for(j = 0; j < size; j++)
val[j] = va_arg(args, char);
但後來,我的價值觀出了問題。
任何想法或幫助嗎?
您不能提前決定您計劃通過的所有數據類型嗎?然後爲每一個分配一個參數。將第一個參數保留爲int,然後指示類型。函數HAS的調用者知道傳遞哪個數據類型。更傳統的做法是傳遞void *和int參數,然後根據int(或enum)將void *參數轉換爲正確的數據類型。 – 2010-07-09 14:11:40
這是我想要避免的。我的數據類型是已知的,但只有在用戶特定的回調函數中才能處理這些數據。我想要實現的通用函數應該只在數據對象定義的內存中構建一個新的數據對象。這個定義(它是屬性聲明的數組)只有關於每個變量大小的信息。 – Jan 2010-07-09 14:23:42