gpt4 book ai didi

c - 函数 ‘mknod’ 的隐式声明,但我包含了 header

转载 作者:太空狗 更新时间:2023-10-29 11:42:43 25 4
gpt4 key购买 nike

我正在尝试制作一个使用命名管道与 Raspberry Pi 3 上的 C++ 程序通信的 C 程序。

当我编译我的一些代码时,GCC 发出的警告:

/home/pi/BluetoothTest/btooth.c|76|警告:函数‘mknod’的隐式声明[-Wimplicit-function-declaration]|

这是函数的代码,包括上面的#if:

#if defined __USE_MISC || defined __USE_BSD || defined __USE_XOPEN_EXTENDED
extern int mknod (const char *__path, __mode_t __mode, __dev_t __dev)
__THROW __nonnull ((1));

这是我在文件中包含的内容:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <pthread.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.h>
#include <bluetooth/rfcomm.h>
//#include <linux/stat.h>

程序试图在这里创建管道:

umask(0);
fifo = mknod(PIPE_LOC, S_IFIFO|0666, 0);
fp = fopen(PIPE_LOC, "w");

fifo 是一个 int,它不会在其他任何地方使用,而 fp 是一个 FILE* 到管道。我所做的一些调试显示 fifomknod 运行后的值为 -1,可能是因为编译器似乎无法找到函数的实现。

如何让 GCC 知道在哪里可以找到 mknod 的实现?

最佳答案

如您所见,要在预处理阶段之后保留 mknod() 函数声明,应定义三个宏之一 (__USE_MISC, __USE_BSD, __USE_XOPEN_EXTENDED)。否则,mknod() 的声明将在预处理阶段被删除。

#if defined __USE_MISC || defined __USE_BSD || defined __USE_XOPEN_EXTENDED
extern int mknod (const char *__path, __mode_t __mode, __dev_t __dev)
__THROW __nonnull ((1));

您可以使用编译器选项:-std=gnu99 -D_GNU_SOURCE 或者您可以自己定义这些宏并将它们放在头文件包含之上。

关于c - 函数 ‘mknod’ 的隐式声明,但我包含了 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36506375/

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