Перейти к содержанию
    

Мало сплю последнее время и тупею потому :( . Итак есть тип заданный typedef . Как проверить его соответствует он int или float (третьего не дано) - от этого будут зависеть остальные действия...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мало сплю последнее время и тупею потому :( . Итак есть тип заданный typedef . Как проверить его соответствует он int или float (третьего не дано) - от этого будут зависеть остальные действия...

Что значит проверить? Чему задано, тому и соответствует. Типизация-то статическая. Или пример приведите, где этот вопрос возникает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мало сплю последнее время и тупею потому :( . Итак есть тип заданный typedef . Как проверить его соответствует он int или float (третьего не дано) - от этого будут зависеть остальные действия...
Я бы рядом с typedef завел константу, например "#define TYPEFLOAT 0" и проверял ее значение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Средствами препроцессора, похоже, никак - мне таких не известно.

На этапе компиляции можно попробовать воспользоваться фичами С++, а именно перегрузкой функций.

 

т.е. определить две функции, например:

int f( int x );

и

float f( float x );

и в этих функциях реализовать разные варианты в зависимости от типа. Компилятор разберётся какую из них вызвать, а линкер выбросит лишнее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 и т.д.) будет ровно то же самое.

 

Средствами препроцессора, похоже, никак - мне таких не известно.

На этапе компиляции можно попробовать воспользоваться фичами С++, а именно перегрузкой функций.

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

 

Если надо статически разрешать вопрос, то для этого есть все средства - контроль типов. Если все же на рантайме, то в ++ есть такая фишка - RTTI. Но что-то мне подсказывает, что тут не тот случай. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

    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
    { // если целочисленная арифметика
    }

Изменено пользователем GetSmart

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Оператор typeid возвращает ссылку на структуру type_info, которая содержит поля, позволяющие получить информацию о типе:

http://msdn.microsoft.com/en-us/library/fyf39xec.aspx

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

    typedef float real;

    const double tmp = 1.0/3;

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

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

 

IAR 4.20

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мало сплю последнее время и тупею потому :( . Итак есть тип заданный typedef . Как проверить его соответствует он int или float (третьего не дано) - от этого будут зависеть остальные действия...
Какой язык (С/С++) и что подразумевается под 'остальными действиями'?

 

Если С++ то можно воспользоваться шаблонным классом и его специализациями для int/float/etc

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В книге А.Александреску "Современное проектирование на С++" этим вопросам уделено довольно много внимания.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...