как сделать различными одинаковые типы? в избранное  новое горячее всё    подписка   модер. 
От: wils0nwww.atzone.org
Дата: 28.05.08 14:23
Доброго времени суток!

Меня беспокоит следующая проблема. У меня в программе есть переменные, которые иммеют одинаковое синтаксическое представление (массивы целых чисел), но разные по семантике. Как сделать так, чтоб компилятор мог их различать во время компиляции? Такое вообще возможно?

компилятор gcc 4.1

Т.е. примерно так

typedef long* TYPE1;   // ??? как быть?
typedef long* TYPE2;

void test (TYPE1 x)
{
  return
}

int main()
{
  TYPE2 y;
  test(y);     //  ВОТ ЗДЕСЬ ХОЧЕТСЯ, ЧТОБ КОМПИЛЯТОР РУГАЛСЯ
  return 0;
}

Если это флуд, то извиняюсь заранее
gcc 4.2
Re: как сделать различными одинаковые типы? в избранное  новое    модер. 
От: Аноним 320 
Дата: 28.05.08 14:28
Здравствуйте, wils0n, Вы писали:

W>Доброго времени суток!


W>Меня беспокоит следующая проблема. У меня в программе есть переменные, которые иммеют одинаковое синтаксическое представление (массивы целых чисел), но разные по семантике. Как сделать так, чтоб компилятор мог их различать во время компиляции? Такое вообще возможно?

...

Как-нить так попробуй
struct TYPE1 {
  long* data;
  operator long*& () { return data; }
};
struct TYPE2 {
  long* data;
  operator long*& () { return data; }
};
Re[2]: как сделать различными одинаковые типы? в избранное  новое    модер. 
От: wils0nwww.atzone.org
Дата: 28.05.08 14:33
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, wils0n, Вы писали:


W>>Доброго времени суток!


W>>Меня беспокоит следующая проблема. У меня в программе есть переменные, которые иммеют одинаковое синтаксическое представление (массивы целых чисел), но разные по семантике. Как сделать так, чтоб компилятор мог их различать во время компиляции? Такое вообще возможно?

А>...

А>Как-нить так попробуй

А>
А>struct TYPE1 {
А>  long* data;
А>  operator long*& () { return data; }
А>};
А>struct TYPE2 {
А>  long* data;
А>  operator long*& () { return data; }
А>};
А>


operator в gcc не определён.
использование struct пока вижу единственной возможностью, но тогда придётся в коде много менять. А этого не хочется.
gcc 4.2
Re: как сделать различными одинаковые типы? в избранное  новое    модер. 
От: Erop 
Дата: 28.05.08 14:39
Здравствуйте, wils0n, Вы писали:

W>Меня беспокоит следующая проблема. У меня в программе есть переменные, которые иммеют одинаковое синтаксическое представление (массивы целых чисел), но разные по семантике. Как сделать так, чтоб компилятор мог их различать во время компиляции? Такое вообще возможно?


Язык С?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: как сделать различными одинаковые типы? в избранное  новое    модер. 
От: Bell 
Дата: 28.05.08 14:44
Здравствуйте, wils0n, Вы писали:

Так можно ?
typedef int* TYPE1;
typedef long* TYPE2;
Любите книгу — источник знаний (с) М.Горький
Re[2]: как сделать различными одинаковые типы? в избранное  новое    модер. 
От: Erop 
Дата: 28.05.08 14:51
Здравствуйте, Bell, Вы писали:

B>
B>typedef int* TYPE1;
B>typedef long* TYPE2;
B>


Если это С, то не поможет, а если это С++, то лучше так:
typedef enum { TYPE1_MIN = INT_MIN, TYPE1_MAX = INT_MAX } * TYPE1;
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: как сделать различными одинаковые типы? в избранное  новое    модер. 
От: wils0nwww.atzone.org
Дата: 28.05.08 15:09
Здравствуйте, wils0n, Вы писали:


W>компилятор gcc 4.1



Язык GNU C.
gcc 4.2
Re[2]: как сделать различными одинаковые типы? в избранное  новое    модер. 
От: Erop 
Дата: 28.05.08 16:10
Оценка:3 (1)
Здравствуйте, wils0n, Вы писали:

W>Язык GNU C.

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

Правда, если gcc 4 умеет выдавать предупреждения при приведении указателей разных типов, ты можешь хаккернуть следующим образом.
typedef struct TYPE1tag { long field } * TYPE1;   // ??? как быть?
typedef struct TYPE2tag { long field } * TYPE2;   

//  sizeof( TYPE1tag ) sizeof( long )!!!

long test (TYPE1 x_)
{
  long* x = (long*)x_;
  return *x;
}

int main()
{
  TYPE2 y;
  test(y);     //  ВОТ ЗДЕСЬ ХОЧЕТСЯ, ЧТОБ КОМПИЛЯТОР РУГАЛСЯ -- возможно будет warning...
  return 0;
}
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: как сделать различными одинаковые типы? в избранное  новое    модер. 
От: wils0nwww.atzone.org
Дата: 28.05.08 20:32
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, wils0n, Вы писали:


W>>Язык GNU C.

E>В С указатели приводятся свободно, так что ничего не выйдет. Единственный выход -- передавать таки структуру, у которой есть поле -- указатель на массив.

E>Правда, если gcc 4 умеет выдавать предупреждения при приведении указателей разных типов, ты можешь хаккернуть следующим образом.

E>
typedef struct TYPE1tag { long field } * TYPE1;   // ??? как быть?
E>typedef struct TYPE2tag { long field } * TYPE2;   

E>//  sizeof( TYPE1tag ) sizeof( long )!!!

E>long test (TYPE1 x_)
E>{
E>  long* x = (long*)x_;
E>  return *x;
E>}

E>int main()
E>{
E>  TYPE2 y;
E>  test(y);     //  ВОТ ЗДЕСЬ ХОЧЕТСЯ, ЧТОБ КОМПИЛЯТОР РУГАЛСЯ -- возможно будет warning...
E>  return 0;
E>}


Прикольно получилось. В любом случае интересная информация!
gcc 4.2