我在mingw上收到此错误:
pr1.c是文件名

我遇到了一些问题,然后添加了这样的库,但现在遇到了以下错误:

$ gcc pr1.c -o pr1.exe -lwsock32 -lws2_32

pr1.c: In function 'main':
pr1.c:54:2: warning: incompatible implicit declaration of built-in function 'b
zero' [enabled by default]
C:\Users\rak\AppData\Local\Temp\ccMtb7Wt.o:pr1.c:(.text+0xc9): undefined refe
rence to `inet_pton'
C:\Users\rak\AppData\Local\Temp\ccMtb7Wt.o:pr1.c:(.text+0xe2): undefined refe
rence to `bzero'
C:\Users\rak\AppData\Local\Temp\ccMtb7Wt.o:pr1.c:(.text+0x1b5): undefined ref
erence to `bzero'
C:\Users\rak\AppData\Local\Temp\ccMtb7Wt.o:pr1.c:(.text+0x224): undefined ref
erence to `bzero'
c:/mingw/bin/../lib/gcc/mingw32/4.7.2/../../../../mingw32/bin/ld.exe: C:\Users\rak\AppData\Local\Temp\ccMtb7Wt.o: bad reloc address 0x20 in section `.eh_frame'
c:/mingw/bin/../lib/gcc/mingw32/4.7.2/../../../../mingw32/bin/ld.exe: final link
 failed: Invalid operation
collect2.exe: error: ld returned 1 exit status

最佳答案

bzero是非标准功能,不推荐使用,并已从POSIX 2008中删除。bzero的手册页中:


  符合
        4.3BSD。不建议使用此函数(在POSIX.1-2001中标记为LEGACY):在新程序中使用memset(3)。 POSIX.1-2008删除了bzero()的规范。


因此,对于cnicutar suggested,您应该改用memset

memset(ptr, 0, sizeof *ptr);


作为附带说明,请注意以下事实:如果ptr的目标包含指针,则上面的memset不会使指针为NULL,而只会使指针为0,这可能与NULL不同。

如果是struct,最好的方法是这样的:

struct something
{
    int a;
    int b;
    char *c;
    int d;
};

struct something var;
...
var = (struct something){0};  /* or NULL if first argument is a pointer */
/* or alternatively */
var = (struct something){ .a = 0 };


对于struct的数组,最标准的方法是for循环,然后如上所述将struct调零。



关于inet_pton函数,也许this question可以帮助您,建议使用WSAAddressToString函数。

08-24 18:26