gpt4 book ai didi

c - 即使包含头文件,ntohll 也会出现 "implicit declaration of function"错误

转载 作者:行者123 更新时间:2023-11-30 16:34:49 26 4
gpt4 key购买 nike

我已经包含了这些头文件,即使如此,我也收到此错误

#include <sys/types.h>
#include <netinet/in.h>
#include <inttypes.h>


error: implicit declaration of function ‘ntohll’ [-Werror=implicit-function-declaration]
uint64_t bits = ntohll(*(uint64_t *)tmp);

最佳答案

系统可能不支持htonll、ntohll。通过宏来实现功能。您需要检查字节顺序宏。如果您不知道该系统的字节顺序,请使用下面的 is_big_endian() 函数。

我测试了这段代码。

#include <stdio.h>

#include <sys/types.h>
#include <netinet/in.h>
#include <inttypes.h>

#if __BIG_ENDIAN__
#define htonll(x) (x)
#define ntohll(x) (x)
#else
#define htonll(x) ((((uint64_t)htonl(x&0xFFFFFFFF)) << 32) + htonl(x >> 32))
#define ntohll(x) ((((uint64_t)ntohl(x&0xFFFFFFFF)) << 32) + ntohl(x >> 32))
#endif

void dump_bin(unsigned char *p, int len) {
int i=0;
for (i=0; i<len; i++) {
printf("%02x ", p[i]) ;
}
printf("\n");
}

int is_big_endian() {
union {
int i ;
char c[4] ;
} v = { 0x00000001 } ;
return v.c[3]==1 ;
}

int main() {

#if __BIG_ENDIAN__
printf("macro: big_endian.\n") ;
#else
printf("macro: little_endian.\n") ;
#endif

printf("System is big endian? : %d\n", is_big_endian());

long long ll=123456789012345678L;
long long ll2=0;

printf("long long value=%lld\n", ll) ;
dump_bin((unsigned char*)&ll, sizeof(ll)) ;

ll2=htonll(ll) ;
printf("htonll=%lld\n", ll2) ;
dump_bin((unsigned char*)&ll2, sizeof(ll2)) ;

return 0 ;
}

输出在这里。

macro: little_endian.
System is big endian? : 0
long long value=123456789012345678
4e f3 30 a6 4b 9b b6 01
htonll=5688944245090268673
01 b6 9b 4b a6 30 f3 4e

关于c - 即使包含头文件,ntohll 也会出现 "implicit declaration of function"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49163198/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com