Как получить тип переменной в коде C?

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

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

#pragma omp parallel for reduction(+:x)

в это:

my_reduction(PLUS, &x, sizeof(x));
#pragma omp parallel for

где раньше у меня (скажем)

enum reduction_op {PLUS, MINUS, TIMES, AND,
  OR, BIT_AND, BIT_OR, BIT_XOR, /* ... */};

А такжеmy_reduction имеет подпись

void my_reduction(enum reduction_op op, void * var, size_t size);

Среди прочего,my_reduction пришлось бы применить операцию сложения к редукционной переменной, как первоначально предполагал программист. Но моя функция не может знать, как сделать это правильно. В частности, хотя он знает вид операции (PLUS), местоположение исходной переменной (var), а также размер типа переменной, он не знает сам тип переменной. В частности, он не знает,var имеет целочисленный тип или тип с плавающей точкой. От POV низкого уровня операция сложения для этих двух классов типов полностью отличается.

Если бы только нестандартный операторtypeof, который поддерживает GCC, будет работать так, как работает sizeof - возвращая какую-то переменную типа - я мог бы легко решить эту проблему. Но typeof на самом деле не похож на sizeof: его можно использовать только, по-видимому, в объявлениях l-значения.

Теперь компилятор, очевидно, знает тип x до того, как завершит генерацию исполняемого кода. Это заставляет меня задуматься, могу ли я каким-то образом использовать синтаксический анализатор GCC, просто чтобы получитьxвведите и передайте его моему сценарию, а затем снова запустите GCC, чтобы скомпилировать мой измененный исходный код. Тогда было бы достаточно просто объявить

enum var_type { INT8, UINT8, INT16, UINT16, /* ,..., */ FLOAT, DOUBLE};
void my_reduction(enum reduction_op op, void * var, enum var_type vtype);

А такжеmy_reduction может привести к соответствующему преобразованию перед разыменованием и применением оператора.

Как видите, я пытаюсь создать некий «диспетчерский» механизм на C. Почему бы просто не использовать перегрузку C ++? Поскольку мой проект заставляет меня работать с унаследованным исходным кодом, написанным на C. Я могу изменить код автоматически с помощью сценария, но я не могу переписать его на другой язык.

Спасибо!

Ответы на вопрос(5)

Ваш ответ на вопрос