- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
是的,这个问题已经被问过很多次了,我一直在寻找和阅读论坛和 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_open
和 pipe_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/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!