Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: typedef
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
DRUID3
Мало сплю последнее время и тупею потому sad.gif . Итак есть тип заданный typedef . Как проверить его соответствует он int или float (третьего не дано) - от этого будут зависеть остальные действия...
dxp
Цитата(DRUID3 @ May 25 2008, 09:19) *
Мало сплю последнее время и тупею потому sad.gif . Итак есть тип заданный typedef . Как проверить его соответствует он int или float (третьего не дано) - от этого будут зависеть остальные действия...

Что значит проверить? Чему задано, тому и соответствует. Типизация-то статическая. Или пример приведите, где этот вопрос возникает.
DpInRock
Sizeof()
Okorok
Цитата(DRUID3 @ May 25 2008, 04:19) *
Мало сплю последнее время и тупею потому sad.gif . Итак есть тип заданный typedef . Как проверить его соответствует он int или float (третьего не дано) - от этого будут зависеть остальные действия...
Я бы рядом с typedef завел константу, например "#define TYPEFLOAT 0" и проверял ее значение.
SSerge
Средствами препроцессора, похоже, никак - мне таких не известно.
На этапе компиляции можно попробовать воспользоваться фичами С++, а именно перегрузкой функций.

т.е. определить две функции, например:
int f( int x );
и
float f( float x );
и в этих функциях реализовать разные варианты в зависимости от типа. Компилятор разберётся какую из них вызвать, а линкер выбросит лишнее.
dxp
Цитата(DpInRock @ May 25 2008, 15:15) *
Sizeof()

И?

Код
#include <stdio.h>

int main()
{
    printf("\nSizeof int   = %d", sizeof(int));
    printf("\nSizeof float = %d", sizeof(float));
    return 0;
}


вывод:

Код
Sizeof int   = 4
Sizeof float = 4


Это РС. На многих 32-разрядных платформах (ARM7, Blackfin и т.д.) будет ровно то же самое.

Цитата(SSerge @ May 25 2008, 16:03) *
Средствами препроцессора, похоже, никак - мне таких не известно.
На этапе компиляции можно попробовать воспользоваться фичами С++, а именно перегрузкой функций.

Вроде, про функции речи вообще не было.

Если надо статически разрешать вопрос, то для этого есть все средства - контроль типов. Если все же на рантайме, то в ++ есть такая фишка - RTTI. Но что-то мне подсказывает, что тут не тот случай. smile.gif
Alex B._
если это gcc, то можно использовать typeof()
GetSmart
Код
    typedef float real;

    const float tmp = 1.0/3;  // любое число, только не 0 :)

    if (*(real *)&tmp == tmp)
    { asm("NOP");
    }

У меня такой код в случае несоответствия типа вообще выбрасывается. Браво компилятору (IAR). В случае совпадения типов остаётся только ядро IFa без сравнения.

Или так:
Код
    typedef int real;

    #define RealIsFloat ((real)0.5f == 0.5f)

    if (RealIsFloat)
    { // если плавающая арифметика
    }
    else
    { // если целочисленная арифметика
    }
Nitrotoluol
Оператор typeid возвращает ссылку на структуру type_info, которая содержит поля, позволяющие получить информацию о типе:
http://msdn.microsoft.com/en-us/library/fyf39xec.aspx
GetSmart
Код
    typedef float real;

    const double tmp = 1.0/3;

    if (*(real *)&tmp == tmp)
    { asm("NOP");
    }
    else
    { asm("NOP");
      asm("NOP");
    }

Не поверите smile.gif В IAR-e выполняются сразу оба варианта внутри IFa. Когда же в typedef стоит int, то всё нормально.

IAR 4.20
XVR
Цитата(DRUID3 @ May 25 2008, 06:19) *
Мало сплю последнее время и тупею потому sad.gif . Итак есть тип заданный typedef . Как проверить его соответствует он int или float (третьего не дано) - от этого будут зависеть остальные действия...
Какой язык (С/С++) и что подразумевается под 'остальными действиями'?

Если С++ то можно воспользоваться шаблонным классом и его специализациями для int/float/etc
sergeeff
В книге А.Александреску "Современное проектирование на С++" этим вопросам уделено довольно много внимания.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.