Как получить тип переменной в коде 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 целочисленный тип или тип с плавающей запятой. С точки зрения низкоуровневой точки зрения операция сложения для этих двух классов типов полностью отличается.

Если бы только нестандартный оператор 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. Я могу автоматически изменять код с помощью сценария, но я не могу переписать его на другой язык.

Спасибо!

11
задан Ciro Santilli 新疆改造中心法轮功六四事件 19 April 2018 в 08:06
поделиться