gpt4 book ai didi

C 警告 : implicit declaration of function

转载 作者:太空宇宙 更新时间:2023-11-04 01:14:48 25 4
gpt4 key购买 nike

是的,这个问题已经被问过很多次了,我一直在寻找和阅读论坛和 SO 帖子,但答案都与这个问题无关(或者看起来)。所以,我有这个 main 文件:

-- sgbd_server.c --

#include "sgbd_server.h"

/**
* Open server pipe and return handle. -1 = error
*/
int open_server_pipe() {
return pipe_open(FIFO_NAME, O_RDONLY, S_CON_COLOR);
}

/**
* Close server pipe
*/
void close_server_pipe(int fd) {
pipe_close(fd, FIFO_NAME, S_CON_COLOR);
}


int main(int argc, char *argv[]) {
int pipe_fd;
pipe_fd = open_server_pipe();

if (pipe_fd == -1) {
perror("Cannot open pipe");
}

close_server_pipe(pipe_fd);

exit(EXIT_SUCCESS);
}

然后是头文件:

-- sgbd_server.h --

#include "common.h"

#define FIFO_NAME "./sgbd_server_pipe"
#define BUFFER_SIZE PIPE_BUF

#define S_CON_COLOR 1 /* C_COLOR_RED */

-- common.h --

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <limits.h>
#include <sys/types.h>
#include <sys/stat.h>

#include "console.h"

#define CLIENT_FIFO_PREFIX = "./sgbd_client_"

int pipe_open(char *f, int mode, int color);

void pipe_close(int pipe_fd, char *f, int color);

pipe_openpipe_close 这两个函数在 pipe.c 中定义,基本上返回 0无效。最后一个文件在 Make 文件中单独编译。

我不是制作 Make 文件的大师,但为了这个问题,这里是:

SERVER    = sgbd_server
CLIENT = sgbd_client

CC = gcc
C_FLAGS = -Wall -I.
LINKER = gcc
L_FLAGS = -Wall -l pthread -Wall -I.

RM = rm -f


client: sgbd_client.o pipe.o console.o
@echo -n "Building client... "
@$(LINKER) $(L_FLAGS) -o $(CLIENT) sgbd_client.o pipe.o console.o
@echo "Complete!\n"

server: sgbd_server.o pipe.o console.o
@echo -n "Building server... "
@$(LINKER) $(L_FLAGS) -o $(SERVER) sgbd_server.o pipe.o console.o
@echo "Complete!\n"

sgbd_client.o: sgbd_client.c
@echo -n "Refreshing client sources... "
@$(CC) $(C_FLAGS) -c sgbd_client.c
@echo "Done!"

sgbd_server.o: sgbd_server.c common.h
@echo -n "Refreshing server sources..."
@$(CC) $(C_FLAGS) -c sgbd_server.c common.h
@echo "Done!"

pipe.o: pipe.c
@echo -n "Refreshing pipe sources..."
@$(CC) $(C_FLAGS) -c pipe.c
@echo "Done!"

console.o: console.c
@echo -n "Refreshing console sources..."
@$(CC) $(C_FLAGS) -c console.c
@echo "Done!"

clean:
@echo -n "Cleaning up executables and object files... "
@$(RM) $(SERVER) $(CLIENT) *.o
@echo "Ok\n"

** 注意 ** :文件 console.c 并实现了一些功能来控制控制台上的 I/O,没什么特别的。如你所见,它也是单独编译的。

现在,当我键入 make client 时,一切都很好,鸟儿正在签名等等。但是当我键入 make server 时,它吐出

sgbd_server.c: In function ‘open_server_pipe’:
sgbd_server.c:7: warning: implicit declaration of function ‘pipe_open’
sgbd_server.c: In function ‘close_server_pipe’:
sgbd_server.c:14: warning: implicit declaration of function ‘pipe_close’

我在 Linux amd64 上运行 GCC,如果它有任何不同(我怀疑)。

现在,它为什么要警告我呢?这两个函数在 common.h 中声明,它包含在 sgbd_server.h 中...我在这里缺少什么?

感谢您的宝贵时间!

** 更新 **

谢谢大家的建议。我确实试图找到在我的包含路径中的其他地方是否会有一个文件 common.h 会以某种方式包含......虽然我没有找到任何会在编译过程中滑落的文件在本地 common.h (sig) 中,我发现一些 .ghc 文件位于我的源文件夹中。由于它们未被 make clean 清除,我手动删除了这些文件。你猜怎么了?没有警告。这些文件是什么,为什么要创建它们?

最佳答案

首先,我认为在 makefile 中将 common.h 提供给编译器不是一个好主意:

@$(CC) $(C_FLAGS) -c sgbd_server.c common.h

这样会更好:

@$(CC) $(C_FLAGS) -c sgbd_server.c

头文件通常只包含一个#include。您似乎在告诉编译器尝试将 common.h 编译为独立的 C 文件。这是客户端和服务器编译命令之间的一个区别,您应该修复它。

我唯一可以建议的另一件事是,您可能没有得到您认为得到的头文件。从放置行开始:

#error Urk! in common.h

在您的 common.h 的顶部并确保构建在那里失败。

如果不是,则该文件来自其他地方。您可能还想对 sgbd_server.h 文件执行相同的操作。


基于您的编辑:

I found some .ghc files sitting in my source folder. Since they are not cleaned by make clean, I deleted manually those files. Guess what? No warning. What are those files and why are they created?

这些是,假设 ghc 是一个拼写错误,你的意思是 gch,由 gcc 生成的预编译头文件,至少部分是为了加快编译过程。无需在构建期间多次处理头文件(每个包含头文件的源文件一次),预编译一次并使用预编译版本效率更高。

我认为这很可能是因为您在执行服务器时在编译器命令行中包含了 common.h。默认情况下,直接提供给 gcc 的头文件将被转换为预编译的头文件,并在此之后优先使用。为了对此进行测试,我创建了一个 qq.h 文件并执行了 gcc qq.h 并弹出了 qq.h.gch

鉴于删除它们可以解决您的问题,这些文件很可能以某种方式导致了您的问题(可能是存在比实际标题更早的预编译标题或完全是其他原因)。您的编译行很有可能:

@$(CC) $(C_FLAGS) -c sgbd_server.c common.h

将首先编译服务器程序,包括旧的预编译头文件,然后从较新的头文件中生成一个新的预编译头文件。

这可能就是为什么对 common.h 的更改没有(立即)效果。你必须 make ;触摸common.h; make 以确保服务器程序中使用较新的预编译头文件。

是否要追溯到根本原因并得到适当的解释是个人喜好问题 - 有一种思想流派认为,您有时应该只记录如何修复它,不要太担心,以免纠缠不清在现实本身的本质上。

当然不是我,我是那种会试图将我的问题追溯到导致问题的单个亚原子粒子的性格类型,但有时实用主义要求我放手:-)

关于C 警告 : implicit declaration of function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4190513/

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