我正在尝试使用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"
非常感谢帮助解决这个问题。
答案 0 :(得分:7)
函数strdup
和strndup
尚未成为标准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)
你可能会发现你可以激活&#39; strndup()
等的声明,通过设置适当的宏来请求POSIX支持:
#define _XOPEN_SOURCE 700
严格来说是X / Open SUS(单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;
}