C89 - 使用灵活的char数组和原型初始化struct

时间:2014-04-26 14:32:54

标签: c arrays struct initialization function-prototypes

我是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;关键是一系列字符?

  • 我的效率是多少?步骤:

    1. 配置#define
    2. 中的值
    3. 创建相应的变量
    4. 将它们作为构造函数参数传递
    5. 初始化结构实例
    6. 将值分配给它的相关密钥

我读到这是为了获得你应该做的最大主机名大小&#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,但我并没有真正理解答案。它还省去了关于方法原型的问题。

1 个答案:

答案 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将给你的最大值是什么。