Повторная типизация переменной, возможно? - PullRequest
0 голосов
/ 08 июля 2011

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

Я бы хотел добиться чего-то, что я написал в другом вопросе: Переменная типирования с другим typedef

Обновление: Добавлен GCC в качестве компилятора.Может иметь расширение, которое поможет?

Ответы [ 4 ]

3 голосов
/ 08 июля 2011

Да, вы можете приводить переменные из одного типа в другой:

 int x = 5;
 double y = (double) x; // <== this is what a cast looks like

Однако вы не можете изменить тип идентификатора 'x' на месте, если это то, что вы спрашиваете.Однако, близко к этому, вы можете ввести еще одну область видимости с этим идентификатором, который объявлен с новым типом:

  int x = 5;
  double y = (double) x;
  {
      double x = y; // NOTE: this isn't the same as the 'x' identifier above
      // ...
  }
  // NOTE: the symbol 'x' reverts to its previous meaning here.

Еще одна вещь, которую вы могли бы сделать, хотя это действительно ужасно, ужасно:1008 *

1 голос
/ 08 июля 2011

Вы выполняете это путем приведения и последующего присвоения.

int f(void * p) {
  int * i;

  i = (int *)p;

  //lots of code here with the i pointer, and every line
  //really thinks that it is an int pointer and will treat it as such
} 

РЕДАКТИРОВАТЬ Из другого связанного с вами вопроса:

typedef struct {
  unsigned char a;
  unsigned char b; 
  unsigned char c;
} type_a;

typedef struct {
 unsigned char e;
 unsigned char f[2];
} type_b;

//initialize type a
type_a sample;
sample.a = 1;
sample.b = 2;
sample.c = 3;

Теперь sample инициализирован,но вы хотите получить доступ к по-другому, вы хотите притвориться , что на самом деле эта переменная имеет другой тип, поэтому вы объявляете указатель на тип, который хотите "замаскировать" sampleкак:

type_b * not_really_b;
not_really_b = (type_b*)&sample;

Видите, в этом вся магия.

not_really_b->e равно 1

not_really_b->f[0] равно 2

not_really_b->f[1] равно 3

Это ответ на ваш вопрос?

0 голосов
/ 08 июля 2011

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

long i;
#define i_as_int ((int)i)

printf( "i = %ld\n", i);
printf( "i = %d\n", i_as_int);

Но не будет ли яснее просто сказать (int) i, если вы это имеете в виду?

0 голосов
/ 08 июля 2011
As long as you realize in C pointers are nothing but addresses of memory 
locations of certain types, you should have your answer. For example the
following program will print the name of the file
<code>
int main(int argc, char *argv[]) {
    int *i;
    i = (int *) argv[0];
    printf("%s\n", argv[0]);
    printf("%s\n", ((char *) i));
}
</code>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...