Return C 中 (void*) 57600 的值
Return value of (void*) 57600 in C
我正在阅读一个UART
外设的源代码,其中有一个功能如下:
eResult = adi_stdio_ControlDevice (hSTDIOUART,
ADI_STDIO_COMMAND_SET_UART_BAUD_RATE, (void *)57600);
此函数用于连接UART
,数字57600
为波特率。我不明白的是(void*)57600
.
的意思
我认为这可能是指向 const
的指针,而 (void*)57600
的 return 值是 57600
。当我们使用 (void*)57600
时,是否意味着我们正在创建一个指向 57600
值的指针?
以及为什么我们必须使用 (void*)57600
?
不完全是。 (void *)57600
的 "return value" (被引用是因为它实际上不是从函数返回,而是强制转换的结果)只是值 57600
被视为(或者,换句话说, 强制转换为) 空指针。
而且,虽然您实际上 将 57600
转换为空指针,但它几乎肯定不会 用作 指针。更有可能的是 adi_stdio_ControlDevice
的原型有一个通用参数(一个可以用于很多事情的参数)。
设备控制功能特别适合这样做,因为它们在各种设备上都是通用的,因此您可能必须为调用提供各种类型。
你会可能发现,对于设置波特率的命令,它只是在使用之前在另一端被转换回一个整数值,比如:
static int localSpeed;
static char *localString;
static double localPi;
static struct rational { int numerator; int denominator } localStruct;
bool adi_stdio_ControlDevice (HANDLE hndl, COMMAND cmd, void *generic) {
switch (cmd) {
case ADI_STDIO_COMMAND_SET_UART_BAUD_RATE: {
localSpeed = (int)generic;
break;
}
case ADI_COMMAND_WITH_STRING_ARG: {
if (localString) free(localString);
localString = strdup((char*)generic);
break;
}
case ADI_COMMAND_WITH_DOUBLE_PTR_ARG: {
localPi = *((double*)generic));
break;
}
case ADI_COMMAND_WITH_STRUCT_PTR: {
memcpy(localStruct, generic, sizeof(localStruct));
break;
}
}
}
其他命令(例如我添加的假命令)将能够以多种方式使用通用参数,例如整数或其他指针类型。
该调用的文档(用于 Blackfin® 处理器的 VisualDSP++ 5.0 设备驱动程序和系统服务手册)实际上支持这一点,其中指出:
ADI_STDIO_RESULT adi_stdio_ControlDevice (
ADI_STDIO_DEVICE_HANDLE hStdioDevice,
uint32_t nCommandID,
void *const pValue
);
: : :
pValue
: Argument required for executing the command. Depending upon the command, different types of arguments are required.
我正在阅读一个UART
外设的源代码,其中有一个功能如下:
eResult = adi_stdio_ControlDevice (hSTDIOUART,
ADI_STDIO_COMMAND_SET_UART_BAUD_RATE, (void *)57600);
此函数用于连接UART
,数字57600
为波特率。我不明白的是(void*)57600
.
我认为这可能是指向 const
的指针,而 (void*)57600
的 return 值是 57600
。当我们使用 (void*)57600
时,是否意味着我们正在创建一个指向 57600
值的指针?
以及为什么我们必须使用 (void*)57600
?
不完全是。 (void *)57600
的 "return value" (被引用是因为它实际上不是从函数返回,而是强制转换的结果)只是值 57600
被视为(或者,换句话说, 强制转换为) 空指针。
而且,虽然您实际上 将 57600
转换为空指针,但它几乎肯定不会 用作 指针。更有可能的是 adi_stdio_ControlDevice
的原型有一个通用参数(一个可以用于很多事情的参数)。
设备控制功能特别适合这样做,因为它们在各种设备上都是通用的,因此您可能必须为调用提供各种类型。
你会可能发现,对于设置波特率的命令,它只是在使用之前在另一端被转换回一个整数值,比如:
static int localSpeed;
static char *localString;
static double localPi;
static struct rational { int numerator; int denominator } localStruct;
bool adi_stdio_ControlDevice (HANDLE hndl, COMMAND cmd, void *generic) {
switch (cmd) {
case ADI_STDIO_COMMAND_SET_UART_BAUD_RATE: {
localSpeed = (int)generic;
break;
}
case ADI_COMMAND_WITH_STRING_ARG: {
if (localString) free(localString);
localString = strdup((char*)generic);
break;
}
case ADI_COMMAND_WITH_DOUBLE_PTR_ARG: {
localPi = *((double*)generic));
break;
}
case ADI_COMMAND_WITH_STRUCT_PTR: {
memcpy(localStruct, generic, sizeof(localStruct));
break;
}
}
}
其他命令(例如我添加的假命令)将能够以多种方式使用通用参数,例如整数或其他指针类型。
该调用的文档(用于 Blackfin® 处理器的 VisualDSP++ 5.0 设备驱动程序和系统服务手册)实际上支持这一点,其中指出:
ADI_STDIO_RESULT adi_stdio_ControlDevice (
ADI_STDIO_DEVICE_HANDLE hStdioDevice,
uint32_t nCommandID,
void *const pValue
);
: : :
pValue
: Argument required for executing the command. Depending upon the command, different types of arguments are required.