gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:42:30 26 4
gpt4 key购买 nike

如果我在其他地方找不到这个问题的答案,我深表歉意。我想我已经弄清楚发生了什么,但我想咨询更多知识渊博的人。

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

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

我一开始很困惑,认为双引号是字符串文字,但这就是我的想法 - 要将文字传递给函数,它必须用双引号引起来(否则,未声明的标识符错误)。然后字符串文字隐式转换为 void* - 这是正确的吗?

谢谢。

最佳答案

空指针是没有特定底层类型的指针。它可以自由地与任何其他指针进行转换,并且通常用于可能使用任何指针的情况。

在您的问题中,您似乎在声明您有一个类似的函数:

void someFn (void *param);

并且您可以使用以下方式调用它:

someFun ("pax_is_really_great");

这样就可以了。没有什么问题,它应该工作,char *作为函数调用的一部分隐式转换为void *。您可以轻松地执行以下操作:

int xyzzy = 42;
someFun (&xyzzy);

并且指向xyzzy变量的int *指针也将被转换为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);

但这一切都归结为确保您在某处有一个缓冲区,该缓冲区将作为 void 指针转到该函数。

关于c - C 函数调用中的双引号参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20127736/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com