#define SOMETHING типа int16_t - PullRequest
       1

#define SOMETHING типа int16_t

3 голосов
/ 13 мая 2011

Как определить различные типы целых?

У меня есть следующие

struct movCommand
{
    uint8_t type;
    uint8_t order;
    int16_t height;
    uint16_t distance;
    int16_t yaw;
};

, и я должен определить их в соответствии с типами.

Чтоправильный синтаксис для #define при выборе типа для определения?

РЕДАКТИРОВАТЬ:

Похоже, мой вопрос был неправильно понят.

Я хочу сделать это#define LANDING_COMMAND "2" Но я хочу установить тип команды посадки, потому что это должно быть int16_t

Ответы [ 7 ]

4 голосов
/ 13 мая 2011

Вы не используете #define для этого. Вы #include <stdint.h>

2 голосов
/ 13 мая 2011

Если вы работаете с C99, вы можете использовать typedef s из <stdint.h> или <inttypes.h><inttypes.h> может быть доступно, даже если <stdint.h> нет - в компиляторах не-C99).

Если они доступны (они обычно есть), все типы, которые вы показываете, будут предоставлены этими заголовками.

В общем, typedef предпочтительнее, чем #define.

2 голосов
/ 13 мая 2011

Вместо того, чтобы использовать директиву #define, я бы использовал typedef, именно так стандартная библиотека будет определять их внутри <stdint.h> (по крайней мере на C99-совместимой платформе). Если вы посмотрите в этот заголовок, вы увидите, как они определены конкретно на их платформе. Типичные typedefs будут:

typedef unsigned char uint8_t;
typedef signed char int8_t;
typedef unsigned short uint16_t;
typedef signed short int16_t;
typedef unsigned int uint32_t;
typedef int int32_t;
//... etc., etc.

В заголовочном файле определено намного больше typedef, включая 64-битные типы и т. Д.

1 голос
/ 13 мая 2011

Что касается вашего нового вопроса, #define заменяется буквально текстом, который вы предоставляете.Поэтому

#define LANDING_COMMAND "2";

Заменит все варианты использования LANDING_COMMAND на "2"; в тексте программы.Это, вероятно, не , что вы хотите.

Во-первых, директивы предварительной обработки не являются частью языка C, они являются частью препроцессора.Поскольку они не являются частью C, они не являются утверждениями, поэтому они не заканчиваются на ;.Если вы оставите это, это, вероятно, вызовет проблемы, если вы собираетесь делать что-то вроде func(LANDING_COMMAND);.

Во-вторых, "2" имеет тип char *, который не может быть преобразован в int16_t с любымбезопасность.Вам нужно использовать литерал 2 для числового значения.

Наконец, для того, чтобы он набрал int16_t, вам необходимо предоставить приведение (((int16_t)2)) или использоватьмакрос INT16_C(2), который расширяется до литерала с соответствующим суффиксом, чтобы сделать его размером (и типом) int16_t.Я рекомендую последнее, но первое должно работать .Макрос INT16_C(2) можно использовать, но он расширяется до литерала (с соответствующим суффиксом) типа int_least16_t, который близок, но без сигары.stdint.h предоставляет только макросы для создания целочисленных константных литералов типов [u]int_leastN_t и типов [u]intmax_t, в более общем случае для типов [u]intN_t или [u]int_fastN_t.Почему они не за мной.

0 голосов
/ 13 мая 2011

#define не имеет типа.Это точно так же, как найти / заменить в вашем редакторе.Вы можете сделать

#define LANDING_COMMAND 2
...
my_movCommand.yaw = LANDING_COMMAND;

Компилятор сделает правильные преобразования типов для вас, но если вы настаиваете на типе int16_t, тогда

#define LANDING_COMMAND ((int16_t)2)
0 голосов
/ 13 мая 2011

Вы не можете делать то, что вы описываете. Другие ответы указывают на обходные пути. Что касается вашего конкретного вопроса, с сайта MSDN :

Выражения должны иметь целочисленный тип и может включать только целое число константы, символьные константы и определенный оператор.

Выражение не может использовать sizeof или a оператор приведения типа.

0 голосов
/ 13 мая 2011

include stdint.h дает вам 8, 16, 32 и 64 подписанных и неподписанных.

http://en.wikipedia.org/wiki/Stdint.h

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...