c/c++语言开发共享当函数需要指针时传递一个常量整数

将常量整数值传递给需要指针的函数的最佳/最经典的方法是什么?

例如, writefunction

 write (int filedes, const void *buffer, size_t size); 

假设我只想写一个字节(1),我会这样想:

 write (fd, 1, 1); 

但我显然得到了警告

 warning: passing argument 2 of 'write' makes pointer from integer without a cast 

我知道我能做到

 int i = 1; write (fd, &i, 1); 

但这是必要的吗? 在不需要声明/初始化新变量的情况下,最正确的方法是什么?

    在C89 / 90中,如果不声明新变量,通常不能这样做。 关于C中指针的事情是它们总是指向左值。 左值是在记忆中有位置的东西。 因此,为了向函数提供正确的参数,您需要在内存中具有位置的东西。 这通常需要一个定义,即一个对象,一个变量。 C中的常量不是左值,因此您不能在那里使用常量。 常量和变量之间的某些东西是文字 。 C89 / 90只有一种文字: 字符串文字 。 字符串文字是左值,但不是变量。 因此,您可以使用字符串文字作为write的第二个参数。

    在C99中,文字的概念扩展到字符串文字之外。 在C99中,您还可以将复合文字用于此目的,这也恰好是左值。 在您的示例中,您可以将您的函数称为

     write(fd, (char[]) { 1 }, 1) 

    但此function仅适用于C99。

    对于您引用的具体案例,您可以这样做:

     write(fd, "01", 1); 

    但是,更一般地说,你必须做你抱怨的事情。 您必须在获取其地址之前声明一个对象:

      SomeType i; SomeFUnction(&i); 

    是的,这是必要的。 在C语言中没有其他方法可以同样清楚,因为你不能获取/获取指向临时的指针。

    (并且,正如@rob已经说过的那样,你应该取一个char的地址。你的例子是不可移植的。)

    编辑 :请参阅@ AndreyT的答案并将编译器设置为C99模式。

    整数不是指针。 如果你传递一个,它将取消引用虚拟地址1并死掉。 您必须创建该变量并传递其地址。

    写需要一个地址作为第二个参数 – 与它一起使用。

    您可以使用drprintf()打印到文件描述符。 它类似于fprintf() ,它打印到FILE *

     int dprintf(int fd, const char *format, ...); 

    有关详细信息,请参阅man 3 dprintf

    函数dprintf()和vdprintf()(在glibc2库中找到)是fprintf(3)和vfprintf(3)的精确模拟,除了它们输出到文件描述符fd而不是stdio流。

    它符合POSIX.1,不是通用的。

     write(var, new int(4)) 

    这似乎有效。 不知道这有多好,因为我没有那么多使用c ++。 如果这是一个不好的方法,请告诉我。

      以上就是c/c++开发分享当函数需要指针时传递一个常量整数相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/545616.html

      (0)
      上一篇 2021年1月10日
      下一篇 2021年1月10日

      精彩推荐