Неизвестный тип возврата для функции C - PullRequest
1 голос
/ 05 августа 2010

Я пишу библиотеку для C, и одна функция может вернуть либо строку (char *), либо целое число, либо двойное число. Кроме того, длина строки неизвестна. Я действительно не знаю, как справиться с этой проблемой. Я думал об использовании указателей в качестве аргументов функции, но это действительно грязно.

Может кто-нибудь дать мне решение, а может, какой-нибудь короткий пример кода? Спасибо.


Редактировать

А как насчет пустого указателя в качестве возвращаемого типа и указателя на размер возвращаемого значения в качестве аргумента:

void* func(int x, int y, int *size) { ... }
/* or */
void* func(int x, int y, int &size) { ... }
/* always confused about them ): */

Ответы [ 3 ]

7 голосов
/ 05 августа 2010

Если функция может возвращать несколько типов, я бы не рекомендовал использовать объединение (по крайней мере, не одно). Ваша функция должна вернуть две части информации: результат и тип результата. Вы можете получить лучший пробег, используя такую ​​структуру:

enum return_val_type {STRING, INT, DOUBLE};
struct return_val {
    enum return_val_type return_type;
    union {
        char*  s;
        int    i;
        double d;
    };
};

Таким образом, вызывающая сторона может проверить значение return_type и определить, как им нужно интерпретировать данные (то есть какое поле объединения использовать).

7 голосов
/ 05 августа 2010

Звучит как очень плохой дизайн, но если вы чувствуете, что по какой-то причине вам нужно это сделать, вы можете использовать объединение для возврата различных типов.

0 голосов
/ 05 августа 2010

Вам придется переделать вашу функцию или иметь несколько версий, основанных на типе.

Подумайте об этом - как компилятор сможет справиться с этим?Предполагая, что реализация находится в отдельном файле .c, функция является черным ящиком для компилятора, поэтому она понятия не имеет, чего ожидать.

Вы можете либо одну версию функции для каждого типа, либо вернутьуказатель или возьмите указатель в качестве аргумента и сохраните в нем значение (что может быть небезопасно, если размер вашего результата неизвестен).

...