Jump to content

    
Sign in to follow this  
DRUID3

typedef

Recommended Posts

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

Share this post


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

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

Share this post


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

Share this post


Link to post
Share on other sites

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

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

 

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

int f( int x );

и

float f( float x );

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

Share this post


Link to post
Share on other sites
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. Но что-то мне подсказывает, что тут не тот случай. :)

Share this post


Link to post
Share on other sites

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

Edited by GetSmart

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

    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

Share this post


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

 

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this