C函数调用中的双引号参数

时间:2013-11-21 17:20:55

标签: c

如果我无法在其他地方找到答案,请道歉。我想我已经知道发生了什么,但我想与更多知识渊博的人一起检查。

我正在查看一些用于GPIB通信的C代码。我使用的API中的一个函数有一个void *参数。此参数是您希望在总线上发送到仪器的命令,因此我认为它被声明为void *因为它将是原始字节。

在使用此API的示例代码中,对此函数的调用将该参数放在双引号内。如果我删除双引号,编译器会抱怨未声明的标识符。

我起初很困惑,认为双引号是字符串文字,但这是我正在考虑的事情 - 将文字传递给函数,它必须用双引号括起来(否则,未声明的标识符)错误)。然后将字符串文字隐式转换为void * - 这是正确的吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

void指针是没有特定基础类型的指针。它可以自由地转换为任何其他指针或从任何其他指针转换,它通常用于可以使用任何指针的情况。

在你的问题的背景下,你似乎在声明你有一个像:

这样的功能
void someFn (void *param);

并且您将其称为:

someFun ("pax_is_really_great");

这是有效的。没有错,应该工作,char *被隐式转换为void *作为函数调用的一部分。你可以轻松地做到:

int xyzzy = 42;
someFun (&xyzzy);

并且指向int *变量的xyzzy指针也将转换为void *。这是否会在运行时运行取决于someFn 使用指针执行什么,但它在编译时完全可以接受。

当您从C字符串中删除引号时,最终会得到:

someFun (pax_is_really_great);

然后编译器认为您正在尝试查找要传入的名为pax_is_really_great的标识符(例如变量)。而且,虽然该变量通常存在于 my 代码中,我明白为什么地球上其他地方的代码可能没有: - )

因此,您可能会从编译器中收到错误,指出您没有在任何地方声明该变量。

最重要的是,你大部分时间都是正确的。您可能会看到如下行:

sendGpib ("\x00\x05hello");

并且指针将指向以下字节,并带有一些神话般的解释:

0x00    command to write a string (len/data)
0x05    five chars to write
'h'     chars to write
'e'
'l'
'l'
'o'
(unused string NUL terminator)

您还可以通过其他方式构建数据,例如:

char buff[] = {0, 5, 'h', 'e', 'l', 'l', 'o'};
sendGpib (buff);

但这一切都归结为确保你有一个缓冲区,它将作为一个空指针转到函数。