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.