C strndup隐式声明

时间:2017-09-02 11:40:24

标签: c

我正在尝试使用strndup函数,但是我收到了错误

  

错误:隐式声明函数'strndup'   [-Werror =隐函数声明]

我已经四处搜索并发现它不是标准函数,因此我必须使用不同的标志进行编译。但是,我通过编译以下内容收到同样的问题:

-std=gnu11
-Wall
-Wextra
-Werror
-Wmissing-declarations
-Wmissing-prototypes
-Werror-implicit-function-declaration
-Wreturn-type
-Wparentheses
-Wunused
-Wold-style-definition
-Wundef
-Wshadow
-Wstrict-prototypes
-Wswitch-default
-Wunreachable-code
-D_GNU_SOURCE

我正在做一项任务,因此我必须使用所有这些,但我发现我必须使用'-D_GNU_SOURCE'进行编译才能使错误消失,但事实并非如此。

修改

我也包括这些:

#define __STDC_WANT_LIB_EXT2__ 1
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "list.h"

非常感谢帮助解决这个问题。

4 个答案:

答案 0 :(得分:7)

函数strdupstrndup尚未成为标准C的一部分。它们在Posix.1-2008中标准化,并在Posix系统的<string.h>中声明。您是否包含<string.h>

如果您的系统不提供这些功能,您可以通过以下方式自行定义:

#include <string.h>

char *strdup(const char *s) {
    size_t size = strlen(s) + 1;
    char *p = malloc(size);
    if (p != NULL) {
        memcpy(p, s, size);
    }
    return p;
}

char *strndup(const char *s, size_t n) {
    char *p = memchr(s, '\0', n);
    if (p != NULL)
        n = p - s;
    p = malloc(n + 1);
    if (p != NULL) {
        memcpy(p, s, n);
        p[n] = '\0';
    }
    return p;
}

答案 1 :(得分:3)

请求POSIX功能

你可能会发现你可以激活&#39; strndup()等的声明,通过设置适当的宏来请求POSIX支持:

#define _XOPEN_SOURCE 700

严格来说是X / Open SU​​S(单Unix规范),但这通常是你想要的。严格只启用POSIX功能需要:

#define _POSIX_C_SOURCE 200809L

-std=gnu11编译器选项通常默认启用所有这些(以及其他特殊选项),因此您遇到问题表明您可能无法使用这些功能。

如果在包含任何标题之前即使设置了启用宏,也没有strndup()可用,您可以编写自己的函数版本。棘手的部分是在合适的标题中提供声明。但是,作为创可贴,您可以在需要它的唯一源文件中将其设为static。如果您有strnlen()可用,也最容易实施。如果你没有strnlen()(一个看似合理的问题),那么你也需要写一下,但普通的C版本可能不会与{{1的汇编程序版本的速度相匹配} - 或使用strnlen()

memchr()

strndup()

(我注意到chqrlie shows使用char *strndup(const char *str, size_t len) { size_t act = strnlen(str, len); char *dst = malloc(act + 1); if (dst != 0) { memmove(dst, str, act); dst[act] = '\0'; } return dst; } 而不是memchr()作为一个简洁的替代方案。)

strnlen()

strnlen()

答案 2 :(得分:2)

在不知道您的代码的情况下,我猜您忘记包含#include <string.h>

strndup()

如果不包含特定标头,则编译器不会看到函数strndup()的声明。因此,GET test_index/_search { "query": { "nested": { "path": "data_detail", "query": { "bool": { "must": [ { "multi_match": { "query": "ABC", "fields": [ "data_detail.*" ] } }, { "term": { "s_id": { "value": "121211" } } } ] } } } } } 的错误消息未被声明。

将上面一行放在代码的顶部,它应该可以正常工作。

答案 3 :(得分:2)

strdup&amp; strndup不是C标准的一部分。它们是POSIX功能。所以你可能没有在你的库中。

char *mystrndup(const char *src, size_t size)
{
    char *duplicate = NULL;
    size_t len;

    if (src != NULL ) //for @chqrlie
    {
        len = strlen(src);
        size = len > (size) ? size + 1 : (size = len + 1))
        duplicate = calloc(sizeof(char), size);

        if (duplicate != NULL)
        {
            strncpy(duplicate, src, size - 1);
        }
        else
        {
            errno = ENOMEM;
        }
    } 
    else
    {
        errno = EINVAL;
    }
    return duplicate;
}