Определение типа переменной во время выполнения в C - PullRequest
1 голос
/ 11 октября 2010

У меня есть несколько переменных типа char (array), int и double. Есть ли способ определить, какой тип они во время выполнения?

Например, я ищу что-то вроде:

int dummyInt = 5;    
double dummyDouble = 5.0;    
dummyInt == int ?
        printf("yes, it's of int type\n") : printf("no, it's not of int type\n");
dummyDouble == int ?
        printf("yes, it's of int type\n") : printf("no, it's not of int type\n");

Где будут очевидные результаты:

да, это типа int
нет, это не тип int

Ну, причина, по которой мне это нужно, заключается в том, что я передаю данные из переменных в базу данных SQL (используя SQLite). Теперь заголовки могут меняться каждый раз, когда я запускаю программу, в зависимости от того, какие переменные используются. Поэтому, когда я создаю таблицу, мне нужно сказать, если это VARCHAR, INTEGER, DOUBLE и т. Д.

Ответы [ 6 ]

5 голосов
/ 11 октября 2010

Нет, вы не можете, но почему вы вообще хотите это делать?C статически типизирован, поэтому, когда вы объявляете int dummyInt = 5, вы уже знаете, что это int.

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

Теперь заголовкиможет меняться каждый раз, когда я запускаю программу в зависимости от того, какие переменные используются.Поэтому, когда я создаю таблицу, мне нужно сказать, является ли она VARCHAR, INTEGER, DOUBLE и т. Д.

Это все еще мало что меняет.Типы все еще известны во время компиляции, поэтому, возможно, все, что вам нужно, это #define рядом с фактической переменной, которая определяет тип SQL, скажем:

int someVar;
#define SOMEVAR_SQL_TYPE "INTEGER"
1 голос
/ 11 октября 2010

В стандарте C отсутствует средство для получения типа переменной во время выполнения;от вас ожидается, что вы будете вести всю свою бухгалтерию в этом отношении.

Если вам нужно создать универсальный контейнер в C, вам нужно будет найти какой-нибудь способ пометить каждый элемент в контейнере некоторой информацией о типе.В зависимости от подхода, это может быть много работы.

1 голос
/ 11 октября 2010

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

Если вы хотите использовать полиморфный подход для чего-то, описанного выше, я рекомендую использовать указатели символови выделить достаточно места в куче для любого необходимого размера во время выполнения.Затем реализуйте функции, которые получают указатель на пространство, размер элемента и количество элементов и выполняют соответствующие операции сравнения / арифметики.Эта реализация может быть очень сложной.Это может быть не сложно, если вы предоставите функцию модуля, которая знает тип, но затем вы вернетесь к знанию типа во время компиляции.

0 голосов
/ 11 октября 2010

У меня была та же проблема, но с использованием C ++ Это не C , но, возможно, существует эквивалент. Мне пришлось использовать заголовок, а затем вызвать typeid ();

Мой код выглядел так:

#include typeinfo

int main()
{ 
    int a = 10;
    cout << typeid(int).name() << endl;
}

Я знаю, что вы можете поделиться заголовочными файлами, чтобы, возможно, это можно было заставить работать?

В выводе typeid использовалась буква для каждого типа (зависит от реализации). то есть беззнаковое целое было выведено как 'j'.

Здесь - мой оригинальный вопрос, аналогичный вашей проблеме.

0 голосов
/ 11 октября 2010

полностью вне спецификации, но попробуйте здесь для одного примера

0 голосов
/ 11 октября 2010

Нет, в C. нет способа сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...