首先,退后一步,问问为什么需要返回多个值。如果这些价值观彼此之间没有某种关联(无论是在功能上还是在操作上),那么您需要停下来重新考虑您在做什么。
如果各种数据项是更大的复合数据类型的一部分(例如邮寄地址,或销售订单中的行项目,或由多个属性描述的其他类型),则定义一个结构类型来表示该复合类型的单个值:
struct addr { // struct type to represent mailing address
char *name;
int streetNumber;
char *streetName;
char *unitNumber;
char *city;
char state[3];
int ZIP;
};
struct addr getAddressFor(char *name) {...}
struct point2D {
int x;
int y;
};
struct polygon2D {
size_t numPoints;
struct point2D *points;
};
struct point2D getOrigin(struct polygon2D poly) {...}
不要不定义一个结构来收集彼此不相关的随机项目;这只会让你和任何需要维护你的代码的人感到困惑。
如果数据项在功能上不相关,但在某种程度上在操作上相关(例如,数据加上状态标志加上关于操作或作为单个输入操作的一部分的项的元数据),那么使用多个可写参数。最明显的例子是标准库中的*scanf() 函数。还有strtod() 和strtol() 函数,它们转换数字的字符串表示形式;它们返回转换后的值,但也将未转换的第一个字符写入单独的参数:
char *str = "3.14159";
double value;
char *chk;
value = strtod(str, &chk);
if (!isspace(*chk) && *chk != 0)
printf("Non-numeric character found in %s\n", str);
您可以结合使用这些方法;这是一个受我目前正在做的工作启发的例子:
typedef enum {SUCCESS, REQ_GARBLED, NO_DATA_OF_TYPE, EMPTY, ERROR} Status;
typedef struct bounds {...} Bounds;
tyepdef struct metadata {
size_t bytesRead;
size_t elementsRead;
size_t rows;
size_t cols;
} Metadata;
typedef struct elevations {
size_t numValues;
short *elevations;
} Elevations;
Elevations elevs;
Metadata meta;
Bounds b = ...; // set up search boundary
Status stat = getElevationsFor(b, &elevs, &meta);
我请求高程数据的服务返回一维值序列;数组的维度作为元数据的一部分返回。