我是C的新手,对结构实例化有一些疑问。我有两个文件:
Index.c
:实例化一个新的Server
结构server/Server.c
定义Server
结构,new_Server()
构造函数和kill_Server()
解构函数 Index.c
的内容:
/* Standard libraries */
#include <stdio.h>
#include <string.h>
/* Project's Custom classes */
#include "./server/Server.c"
/* Configuration value */
#define HOST "127.0.0.1"
#define PORT 80
int main (void) {
unsigned short port = PORT;
unsigned char host[255] = HOST;
Server* server = new_Server(port, host);
return 0;
}
server/Server.c
的内容:
#include <stdlib.h>
/* HOST_NAME_MAX will have to be changed into getconf HOST_NAME_MAX */
#define HOST_NAME_MAX 255
typedef struct {
unsigned short port;
unsigned char host[HOST_NAME_MAX];
} Server;
Server* new_Server (unsigned short port, unsigned char host[]) {
Server* server = malloc(sizeof(Server));
server->port = port;
server->host = host;
return server;
}
void kill_Server (Server* server) {
free(server);
}
编译程序时,我得到以下输出:
In file included from src/index.c:6:
src/./server/Server.c:11:9: warning: no previous prototype for function 'new_Server' [-Wmissing-prototypes]
Server* new_Server (unsigned short port, unsigned char host[]) {
^
src/./server/Server.c:14:15: error: array type 'unsigned char [255]' is not assignable
server->host = host;
~~~~~~~~~~~~ ^
src/./server/Server.c:18:6: warning: no previous prototype for function 'kill_Server' [-Wmissing-prototypes]
void kill_Server (Server* server) {
^
2 warnings and 1 error generated.
(我刚刚省略了&#34;服务器&#34;变量未使用警告。)
所以这是我的问题:
为什么我会得到&#34;缺少原型&#34;警告,因为我确实指定了输出和方法参数类型?
如何使用它初始化结构&#34; host&#34;关键是一系列字符?
我的效率是多少?步骤:
#define
我读到这是为了获得你应该做的最大主机名大小&#34; getconf HOST_NAME_MAX&#34;。在shell中它当然有效,我得到255,但我想将值存储在我的C程序中的变量中。
我正在使用以下GCC标志进行编译:
gcc -g -O0 -Wall -Wextra -std=c89 -pedantic -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations -Wold-style-definition -Wdeclaration-after-statement
我知道这是(不必要的)严格,但我想学习C方式并且真正理解它的来龙去脉。我认为像警告这样的东西对此非常有用。
编辑:我之前已经阅读了这个问题How to initialize a structure with flexible array member,但我并没有真正理解答案。它还省去了关于方法原型的问题。
答案 0 :(得分:2)
好吧,你应该避免使用#include
来包含.c文件。 .c
文件应该单独编译(在.h
文件中包含常见定义),然后将编译好的对象链接在一起。
这两个警告是假的,没有代码问题。您可以通过添加原型来抑制警告(只需复制第11行,但最后添加;
)。第二个相同
错误:server->host = host;
是非法的。数组是C中的二等公民,你不能使用=
运算符复制它们。您需要转到memcpy(&server->host, &host, sizeof server->host);
或strcpy(server->host, host);
。
我认为让你的C程序执行getconf
并看看它得到了什么是过分的。相反,查看getconf
将给你的最大值是什么。