如何定义不同类型的整数?
我有以下
struct movCommand
{
uint8_t type;
uint8_t order;
int16_t height;
uint16_t distance;
int16_t yaw;
};
需要根据它们的类型来定义它们。
选择定义类型时,#define
的正确语法是什么?
编辑:
看起来我的问题被误解了。
我想这样做#define LANDING_COMMAND "2"
但是我想设置登陆命令的类型,因为它需要是int16_t
答案 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个有符号和无符号。
答案 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)