2010-10-11 2 views
1

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

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

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"); 

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

да, это ИНТ типа
нет, это не целого типа

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

+4

Нет. Возможно, вам стоит объяснить, зачем вам это нужно, и может быть представлено лучшее решение. – JoshD

+0

Возможно, вы используете неправильный язык для того, чтобы делать то, что хотите. –

+0

Вы должны написать пример psudo-кода, чтобы продемонстрировать что-то более близкое к вашему заявленному использованию (ввод данных в SQLite db), а не тривиальный пример, который вы предоставили. Ваш пример на самом деле не иллюстрирует проблему, так как ее так легко решить, потому что типы являются постоянными и известными. Пример, который ближе к реальной программе, которую вы пытаетесь написать, может предложить другие решения этой проблемы. – nategoose

ответ

5

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

Edit:

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

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

int someVar; 
#define SOMEVAR_SQL_TYPE "INTEGER" 
0

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

0

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

-2

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

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

#include typeinfo 

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

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

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

Here это мой вопрос orignal, аналогичный вашей проблеме.

+3

чисто C++ (который также включает в себя множество типов) – KevinDTimm

1

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

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

1

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

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

Смежные вопросы