【问题标题】:C89 - Initialising struct with flexible char array and prototypesC89 - 使用灵活的字符数组和原型初始化结构
【发布时间】: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.

(我只是省略了未使用的“服务器”变量警告。)

所以这是我的问题:

  • 既然我确实指定了输出和方法参数类型,为什么会收到“缺少原型”警告?

  • 如何初始化一个结构,它的“主机”键是一个字符数组?

  • 我正在做的事情有效率吗?步骤:

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

我读到要获得最大的主机名大小,您应该执行“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


    【解决方案1】:

    好吧,您应该避免使用#include 来包含 .c 文件。 .c 文件应该单独编译(在 .h 文件中包含公共定义),然后将编译的对象链接在一起。

    这两个警告是假的,不存在代码问题。您可以通过添加原型来抑制警告(只需复制第 11 行,但在末尾添加 ;)。第二个也一样

    错误:server-&gt;host = host; 是非法的。数组是 C 中的二等公民,您不能使用 = 运算符复制它们。你需要要么去memcpy(&amp;server-&gt;host, &amp;host, sizeof server-&gt;host);,要么去strcpy(server-&gt;host, host);

    我认为让你的 C 程序执行 getconf 并看看它得到了什么有点过头了;相反,请查看getconf 将回馈给您的最大值是多少。

    【讨论】:

    • 在这种情况下,问getconf 可能返回多少真的有意义吗?它只是用于在给定的服务器上存储和传递。
    • 好点,他应该动态分配足够的空间来存储调用者提供的任何内容
    • 感谢您的快速回答!我将阅读linking,因为这似乎是主要问题之一。 - 关于主机值分配,有没有办法只“传递”值而不必重新创建/复制参数值? - 我在声明我的方法之前添加了prototype,它确实删除了警告!
    • @MattMcNabb - 我还想知道您是否可以扩展您的最后评论?对于我的示例,C89 中的动态分配如何工作?
    猜你喜欢
    • 2020-07-18
    • 1970-01-01
    • 2017-06-14
    • 2013-11-13
    • 1970-01-01
    • 2017-05-17
    • 2020-06-10
    • 2010-09-22
    • 2015-12-23
    相关资源
    最近更新 更多