#define类型为int16_t的SOMETHING

时间:2011-05-12 22:26:16

标签: c macros

如何定义不同类型的整数?

我有以下

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 个答案:

答案 0 :(得分:4)

您不要使用#define。你#include <stdint.h>

答案 1 :(得分:2)

我不是使用#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位类型等。

答案 2 :(得分:2)

如果您正在使用C99,则可以使用typedef<stdint.h>中的<inttypes.h><inttypes.h>即使<stdint.h>可能也可用typedef不 - 在非C99编译器中。)

如果它们可用(它们通常是),那么您显示的所有类型都将由这些标题提供。

通常,#define优于{{1}}。

答案 3 :(得分:1)

关于您的新问题,#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类型的整数常量字面值。为什么他们没有超越我。

答案 4 :(得分:0)

include stdint.h为您提供8,16,32和64个有符号和无符号。

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

答案 5 :(得分:0)

你无法做你所描述的。其他答案表明了解决方法。至于您的具体问题,请访问MSDN site

  

表达式必须具有整数类型   并且只能包含整数   常量,字符常量和   定义的运算符。

     

表达式不能使用sizeof或a   类型转换操作符。

答案 6 :(得分:0)

#define没有类型。它与编辑器中的查找/替换完全相同。 你可以做到

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

编译器会为您执行正确的类型转换,但如果您坚持使用类型int16_t,那么

#define LANDING_COMMAND ((int16_t)2)