【发布时间】:2014-06-12 07:13:39
【问题描述】:
我是 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.
(我只是省略了未使用的“服务器”变量警告。)
所以这是我的问题:
既然我确实指定了输出和方法参数类型,为什么会收到“缺少原型”警告?
如何初始化一个结构,它的“主机”键是一个字符数组?
-
我正在做的事情有效率吗?步骤:
- 在
#define中配置值 - 创建对应的变量
- 将它们作为构造函数参数传递
- 初始化结构实例
- 将值分配给它的关联键
- 在
我读到要获得最大的主机名大小,您应该执行“getconf HOST_NAME_MAX”。在 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,但我并没有真正理解答案。它还省略了有关方法原型的问题。
【问题讨论】:
标签: c arrays struct initialization function-prototypes