解决error C2011: 'fd_set' : 'struct' type redefinition的方法

解决Windows Socket版本冲突导致的编译错误
本文探讨了在使用最新版本Windows Socket函数时遇到的编译错误问题,详细解释了问题根源在于windows.h文件中包含了过时的winsock.h文件,以及如何通过在代码中添加预处理器指令来解决此冲突。

首先说明这个问题由于重复定义引起的编译错误。

先说明解决方法,然后再说是什么原因导致了这个问题。

 

解决方法:

下列任何一种方法都可以。

1. 在所有包含windows.h的代码之前加上

#define  WIN32_LEAN_AND_MEAN


2. 或者直接在工程的properties( vc6 以上)/Setting(vc6) -> c/c++ -> preprocessor 中添加WIN32_LEAN_AND_MEAN

 

 

问题根由:

因为windows.h中包含了<winsock.h>,这个是早期版本(windows socket 1.1)的windows socket 的头文件,而当你自己的文件中因使用最新版本windows socket的函数,需要包含 winsock2.h。而这两个版本都定义fd_set一系列的结构和函数,所以就出现这样的问题。

 

好,我们看下windows.h的定义,其实看一下这个定义就知道导致问题的原因和解决问题的方法:

#ifndef WIN32_LEAN_AND_MEAN
#include <cderr.h>
#include <dde.h>
#include <ddeml.h>
#include <dlgs.h>
#ifndef _MAC
#include <lzexpand.h>
#include <mmsystem.h>
#include <nb30.h>
#include <rpc.h>
#endif
#include <shellapi.h>
#ifndef _MAC
#include <winperf.h>
#include <winsock.h>
#endif
#ifndef NOCRYPT
#include <wincrypt.h>
#include <winefs.h>
#include <winscard.h>
#endif

 

注意查看我加粗的两行。



转自:点击打开链接

# Question ziheng@ziheng-virtual-machine:/usr/src/linux-6.6.1$ sudo make menuconfig HOSTCC scripts/basic/fixdep HOSTCC scripts/kconfig/mconf.o In file included from /usr/include/linux/limits.h:6, from /usr/include/x86_64-linux-gnu/bits/local_lim.h:38, from /usr/include/x86_64-linux-gnu/bits/posix1_lim.h:161, from /usr/include/limits.h:195, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:203, from /usr/lib/gcc/x86_64-linux-gnu/11/include/syslimits.h:7, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:34, from scripts/kconfig/mconf.c:14: /usr/include/linux/types.h:13:9: error: unknown type name ‘u32’ 13 | typedef u32 __kernel_dev_t; | ^~~ /usr/include/linux/types.h:20:9: error: unknown type name ‘u32’ 20 | typedef u32 nlink_t; | ^~~ /usr/include/linux/types.h:93:9: error: unknown type name ‘u8’ 93 | typedef u8 u_int8_t; | ^~ /usr/include/linux/types.h:94:9: error: unknown type name ‘s8’ 94 | typedef s8 int8_t; | ^~ /usr/include/linux/types.h:95:9: error: unknown type name ‘u16’ 95 | typedef u16 u_int16_t; | ^~~ /usr/include/linux/types.h:96:9: error: unknown type name ‘s16’ 96 | typedef s16 int16_t; | ^~~ /usr/include/linux/types.h:97:9: error: unknown type name ‘u32’ 97 | typedef u32 u_int32_t; | ^~~ /usr/include/linux/types.h:98:9: error: unknown type name ‘s32’ 98 | typedef s32 int32_t; | ^~~ /usr/include/linux/types.h:102:9: error: unknown type name ‘u8’ 102 | typedef u8 uint8_t; | ^~ /usr/include/linux/types.h:103:9: error: unknown type name ‘u16’ 103 | typedef u16 uint16_t; | ^~~ /usr/include/linux/types.h:104:9: error: unknown type name ‘u32’ 104 | typedef u32 uint32_t; | ^~~ /usr/include/linux/types.h:107:9: error: unknown type name ‘u64’ 107 | typedef u64 uint64_t; | ^~~ /usr/include/linux/types.h:108:9: error: unknown type name ‘u64’ 108 | typedef u64 u_int64_t; | ^~~ /usr/include/linux/types.h:109:9: error: unknown type name ‘s64’ 109 | typedef s64 int64_t; | ^~~ /usr/include/linux/types.h:125:9: error: unknown type name ‘u64’ 125 | typedef u64 sector_t; | ^~~ /usr/include/linux/types.h:126:9: error: unknown type name ‘u64’ 126 | typedef u64 blkcnt_t; | ^~~ /usr/include/linux/types.h:145:9: error: unknown type name ‘u32’ 145 | typedef u32 dma_addr_t; | ^~~ /usr/include/linux/types.h:155:9: error: unknown type name ‘u32’ 155 | typedef u32 phys_addr_t; | ^~~ In file included from /usr/include/linux/limits.h:7, from /usr/include/x86_64-linux-gnu/bits/local_lim.h:38, from /usr/include/x86_64-linux-gnu/bits/posix1_lim.h:161, from /usr/include/limits.h:195, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:203, from /usr/lib/gcc/x86_64-linux-gnu/11/include/syslimits.h:7, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:34, from scripts/kconfig/mconf.c:14: /usr/include/x86_64-linux-gnu/bits/xopen_lim.h:99:6: error: missing binary operator before token "(" 99 | # if INT_MAX == 32767 | ^~~~~~~ /usr/include/x86_64-linux-gnu/bits/xopen_lim.h:102:7: error: missing binary operator before token "(" 102 | # if INT_MAX == 2147483647 | ^~~~~~~ /usr/include/x86_64-linux-gnu/bits/xopen_lim.h:126:6: error: missing binary operator before token "(" 126 | # if LONG_MAX == 2147483647 | ^~~~~~~~ In file included from /usr/include/stdlib.h:395, from scripts/kconfig/mconf.c:16: /usr/include/x86_64-linux-gnu/sys/types.h:42:18: error: conflicting types for ‘loff_t’; have ‘__loff_t’ {aka ‘long int’} 42 | typedef __loff_t loff_t; | ^~~~~~ In file included from /usr/include/linux/limits.h:6, from /usr/include/x86_64-linux-gnu/bits/local_lim.h:38, from /usr/include/x86_64-linux-gnu/bits/posix1_lim.h:161, from /usr/include/limits.h:195, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:203, from /usr/lib/gcc/x86_64-linux-gnu/11/include/syslimits.h:7, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:34, from scripts/kconfig/mconf.c:14: /usr/include/linux/types.h:46:33: note: previous declaration of ‘loff_t’ with type ‘loff_t’ {aka ‘long long int’} 46 | typedef __kernel_loff_t loff_t; | ^~~~~~ In file included from /usr/include/stdlib.h:395, from scripts/kconfig/mconf.c:16: /usr/include/x86_64-linux-gnu/sys/types.h:59:17: error: conflicting types for ‘dev_t’; have ‘__dev_t’ {aka ‘long unsigned int’} 59 | typedef __dev_t dev_t; | ^~~~~ In file included from /usr/include/linux/limits.h:6, from /usr/include/x86_64-linux-gnu/bits/local_lim.h:38, from /usr/include/x86_64-linux-gnu/bits/posix1_lim.h:161, from /usr/include/limits.h:195, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:203, from /usr/lib/gcc/x86_64-linux-gnu/11/include/syslimits.h:7, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:34, from scripts/kconfig/mconf.c:14: /usr/include/linux/types.h:16:33: note: previous declaration of ‘dev_t’ with type ‘dev_t’ {aka ‘int’} 16 | typedef __kernel_dev_t dev_t; | ^~~~~ In file included from /usr/include/stdlib.h:395, from scripts/kconfig/mconf.c:16: /usr/include/x86_64-linux-gnu/sys/types.h:74:19: error: conflicting types for ‘nlink_t’; have ‘__nlink_t’ {aka ‘long unsigned int’} 74 | typedef __nlink_t nlink_t; | ^~~~~~~ In file included from /usr/include/linux/limits.h:6, from /usr/include/x86_64-linux-gnu/bits/local_lim.h:38, from /usr/include/x86_64-linux-gnu/bits/posix1_lim.h:161, from /usr/include/limits.h:195, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:203, from /usr/lib/gcc/x86_64-linux-gnu/11/include/syslimits.h:7, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:34, from scripts/kconfig/mconf.c:14: /usr/include/linux/types.h:20:33: note: previous declaration of ‘nlink_t’ with type ‘nlink_t’ {aka ‘int’} 20 | typedef u32 nlink_t; | ^~~~~~~ In file included from /usr/include/x86_64-linux-gnu/sys/types.h:130, from /usr/include/stdlib.h:395, from scripts/kconfig/mconf.c:16: /usr/include/x86_64-linux-gnu/bits/types/timer_t.h:7:19: error: conflicting types for ‘timer_t’; have ‘__timer_t’ {aka ‘void *’} 7 | typedef __timer_t timer_t; | ^~~~~~~ In file included from /usr/include/linux/limits.h:6, from /usr/include/x86_64-linux-gnu/bits/local_lim.h:38, from /usr/include/x86_64-linux-gnu/bits/posix1_lim.h:161, from /usr/include/limits.h:195, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:203, from /usr/lib/gcc/x86_64-linux-gnu/11/include/syslimits.h:7, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:34, from scripts/kconfig/mconf.c:14: /usr/include/linux/types.h:26:33: note: previous declaration of ‘timer_t’ with type ‘timer_t’ {aka ‘int’} 26 | typedef __kernel_timer_t timer_t; | ^~~~~~~ In file included from /usr/include/x86_64-linux-gnu/sys/types.h:155, from /usr/include/stdlib.h:395, from scripts/kconfig/mconf.c:16: /usr/include/x86_64-linux-gnu/bits/stdint-intn.h:24:18: error: conflicting types for ‘int8_t’; have ‘__int8_t’ {aka ‘signed char’} 24 | typedef __int8_t int8_t; | ^~~~~~ In file included from /usr/include/linux/limits.h:6, from /usr/include/x86_64-linux-gnu/bits/local_lim.h:38, from /usr/include/x86_64-linux-gnu/bits/posix1_lim.h:161, from /usr/include/limits.h:195, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:203, from /usr/lib/gcc/x86_64-linux-gnu/11/include/syslimits.h:7, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:34, from scripts/kconfig/mconf.c:14: /usr/include/linux/types.h:94:33: note: previous declaration of ‘int8_t’ with type ‘int8_t’ {aka ‘int’} 94 | typedef s8 int8_t; | ^~~~~~ In file included from /usr/include/x86_64-linux-gnu/sys/types.h:155, from /usr/include/stdlib.h:395, from scripts/kconfig/mconf.c:16: /usr/include/x86_64-linux-gnu/bits/stdint-intn.h:25:19: error: conflicting types for ‘int16_t’; have ‘__int16_t’ {aka ‘short int’} 25 | typedef __int16_t int16_t; | ^~~~~~~ In file included from /usr/include/linux/limits.h:6, from /usr/include/x86_64-linux-gnu/bits/local_lim.h:38, from /usr/include/x86_64-linux-gnu/bits/posix1_lim.h:161, from /usr/include/limits.h:195, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:203, from /usr/lib/gcc/x86_64-linux-gnu/11/include/syslimits.h:7, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:34, from scripts/kconfig/mconf.c:14: /usr/include/linux/types.h:96:33: note: previous declaration of ‘int16_t’ with type ‘int16_t’ {aka ‘int’} 96 | typedef s16 int16_t; | ^~~~~~~ In file included from /usr/include/x86_64-linux-gnu/sys/types.h:155, from /usr/include/stdlib.h:395, from scripts/kconfig/mconf.c:16: /usr/include/x86_64-linux-gnu/bits/stdint-intn.h:27:19: error: conflicting types for ‘int64_t’; have ‘__int64_t’ {aka ‘long int’} 27 | typedef __int64_t int64_t; | ^~~~~~~ In file included from /usr/include/linux/limits.h:6, from /usr/include/x86_64-linux-gnu/bits/local_lim.h:38, from /usr/include/x86_64-linux-gnu/bits/posix1_lim.h:161, from /usr/include/limits.h:195, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:203, from /usr/lib/gcc/x86_64-linux-gnu/11/include/syslimits.h:7, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:34, from scripts/kconfig/mconf.c:14: /usr/include/linux/types.h:109:33: note: previous declaration of ‘int64_t’ with type ‘int64_t’ {aka ‘int’} 109 | typedef s64 int64_t; | ^~~~~~~ In file included from /usr/include/stdlib.h:395, from scripts/kconfig/mconf.c:16: /usr/include/x86_64-linux-gnu/sys/types.h:158:19: error: conflicting types for ‘u_int8_t’; have ‘__uint8_t’ {aka ‘unsigned char’} 158 | typedef __uint8_t u_int8_t; | ^~~~~~~~ In file included from /usr/include/linux/limits.h:6, from /usr/include/x86_64-linux-gnu/bits/local_lim.h:38, from /usr/include/x86_64-linux-gnu/bits/posix1_lim.h:161, from /usr/include/limits.h:195, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:203, from /usr/lib/gcc/x86_64-linux-gnu/11/include/syslimits.h:7, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:34, from scripts/kconfig/mconf.c:14: /usr/include/linux/types.h:93:33: note: previous declaration of ‘u_int8_t’ with type ‘u_int8_t’ {aka ‘int’} 93 | typedef u8 u_int8_t; | ^~~~~~~~ In file included from /usr/include/stdlib.h:395, from scripts/kconfig/mconf.c:16: /usr/include/x86_64-linux-gnu/sys/types.h:159:20: error: conflicting types for ‘u_int16_t’; have ‘__uint16_t’ {aka ‘short unsigned int’} 159 | typedef __uint16_t u_int16_t; | ^~~~~~~~~ In file included from /usr/include/linux/limits.h:6, from /usr/include/x86_64-linux-gnu/bits/local_lim.h:38, from /usr/include/x86_64-linux-gnu/bits/posix1_lim.h:161, from /usr/include/limits.h:195, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:203, from /usr/lib/gcc/x86_64-linux-gnu/11/include/syslimits.h:7, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:34, from scripts/kconfig/mconf.c:14: /usr/include/linux/types.h:95:33: note: previous declaration of ‘u_int16_t’ with type ‘u_int16_t’ {aka ‘int’} 95 | typedef u16 u_int16_t; | ^~~~~~~~~ In file included from /usr/include/stdlib.h:395, from scripts/kconfig/mconf.c:16: /usr/include/x86_64-linux-gnu/sys/types.h:160:20: error: conflicting types for ‘u_int32_t’; have ‘__uint32_t’ {aka ‘unsigned int’} 160 | typedef __uint32_t u_int32_t; | ^~~~~~~~~ In file included from /usr/include/linux/limits.h:6, from /usr/include/x86_64-linux-gnu/bits/local_lim.h:38, from /usr/include/x86_64-linux-gnu/bits/posix1_lim.h:161, from /usr/include/limits.h:195, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:203, from /usr/lib/gcc/x86_64-linux-gnu/11/include/syslimits.h:7, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:34, from scripts/kconfig/mconf.c:14: /usr/include/linux/types.h:97:33: note: previous declaration of ‘u_int32_t’ with type ‘u_int32_t’ {aka ‘int’} 97 | typedef u32 u_int32_t; | ^~~~~~~~~ In file included from /usr/include/stdlib.h:395, from scripts/kconfig/mconf.c:16: /usr/include/x86_64-linux-gnu/sys/types.h:161:20: error: conflicting types for ‘u_int64_t’; have ‘__uint64_t’ {aka ‘long unsigned int’} 161 | typedef __uint64_t u_int64_t; | ^~~~~~~~~ In file included from /usr/include/linux/limits.h:6, from /usr/include/x86_64-linux-gnu/bits/local_lim.h:38, from /usr/include/x86_64-linux-gnu/bits/posix1_lim.h:161, from /usr/include/limits.h:195, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:203, from /usr/lib/gcc/x86_64-linux-gnu/11/include/syslimits.h:7, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:34, from scripts/kconfig/mconf.c:14: /usr/include/linux/types.h:108:33: note: previous declaration of ‘u_int64_t’ with type ‘u_int64_t’ {aka ‘int’} 108 | typedef u64 u_int64_t; | ^~~~~~~~~ In file included from /usr/include/x86_64-linux-gnu/sys/types.h:179, from /usr/include/stdlib.h:395, from scripts/kconfig/mconf.c:16: /usr/include/x86_64-linux-gnu/sys/select.h:70:5: error: conflicting types for ‘fd_set’; have ‘struct <anonymous>’ 70 | } fd_set; | ^~~~~~ In file included from /usr/include/linux/limits.h:6, from /usr/include/x86_64-linux-gnu/bits/local_lim.h:38, from /usr/include/x86_64-linux-gnu/bits/posix1_lim.h:161, from /usr/include/limits.h:195, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:203, from /usr/lib/gcc/x86_64-linux-gnu/11/include/syslimits.h:7, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:34, from scripts/kconfig/mconf.c:14: /usr/include/linux/types.h:15:33: note: previous declaration of ‘fd_set’ with type ‘fd_set’ 15 | typedef __kernel_fd_set fd_set; | ^~~~~~ In file included from /usr/include/stdlib.h:395, from scripts/kconfig/mconf.c:16: /usr/include/x86_64-linux-gnu/sys/types.h:192:20: error: conflicting types for ‘blkcnt_t’; have ‘__blkcnt_t’ {aka ‘long int’} 192 | typedef __blkcnt_t blkcnt_t; /* Type to count number of disk blocks. */ | ^~~~~~~~ In file included from /usr/include/linux/limits.h:6, from /usr/include/x86_64-linux-gnu/bits/local_lim.h:38, from /usr/include/x86_64-linux-gnu/bits/posix1_lim.h:161, from /usr/include/limits.h:195, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:203, from /usr/lib/gcc/x86_64-linux-gnu/11/include/syslimits.h:7, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:34, from scripts/kconfig/mconf.c:14: /usr/include/linux/types.h:126:13: note: previous declaration of ‘blkcnt_t’ with type ‘blkcnt_t’ {aka ‘int’} 126 | typedef u64 blkcnt_t; | ^~~~~~~~ In file included from scripts/kconfig/expr.h:15, from scripts/kconfig/lkc.h:13, from scripts/kconfig/mconf.c:22: scripts/kconfig/list.h:24:8: error: redefinition of ‘struct list_head’ 24 | struct list_head { | ^~~~~~~~~ In file included from /usr/include/linux/limits.h:6, from /usr/include/x86_64-linux-gnu/bits/local_lim.h:38, from /usr/include/x86_64-linux-gnu/bits/posix1_lim.h:161, from /usr/include/limits.h:195, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:203, from /usr/lib/gcc/x86_64-linux-gnu/11/include/syslimits.h:7, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:34, from scripts/kconfig/mconf.c:14: /usr/include/linux/types.h:178:8: note: originally defined here 178 | struct list_head { | ^~~~~~~~~ In file included from /usr/include/stdint.h:37, from /usr/lib/gcc/x86_64-linux-gnu/11/include/stdint.h:9, from /usr/include/curses.h:95, from scripts/kconfig/lxdialog/dialog.h:19, from scripts/kconfig/mconf.c:23: /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h:24:19: error: conflicting types for ‘uint8_t’; have ‘__uint8_t’ {aka ‘unsigned char’} 24 | typedef __uint8_t uint8_t; | ^~~~~~~ In file included from /usr/include/linux/limits.h:6, from /usr/include/x86_64-linux-gnu/bits/local_lim.h:38, from /usr/include/x86_64-linux-gnu/bits/posix1_lim.h:161, from /usr/include/limits.h:195, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:203, from /usr/lib/gcc/x86_64-linux-gnu/11/include/syslimits.h:7, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:34, from scripts/kconfig/mconf.c:14: /usr/include/linux/types.h:102:33: note: previous declaration of ‘uint8_t’ with type ‘uint8_t’ {aka ‘int’} 102 | typedef u8 uint8_t; | ^~~~~~~ In file included from /usr/include/stdint.h:37, from /usr/lib/gcc/x86_64-linux-gnu/11/include/stdint.h:9, from /usr/include/curses.h:95, from scripts/kconfig/lxdialog/dialog.h:19, from scripts/kconfig/mconf.c:23: /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h:25:20: error: conflicting types for ‘uint16_t’; have ‘__uint16_t’ {aka ‘short unsigned int’} 25 | typedef __uint16_t uint16_t; | ^~~~~~~~ In file included from /usr/include/linux/limits.h:6, from /usr/include/x86_64-linux-gnu/bits/local_lim.h:38, from /usr/include/x86_64-linux-gnu/bits/posix1_lim.h:161, from /usr/include/limits.h:195, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:203, from /usr/lib/gcc/x86_64-linux-gnu/11/include/syslimits.h:7, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:34, from scripts/kconfig/mconf.c:14: /usr/include/linux/types.h:103:33: note: previous declaration of ‘uint16_t’ with type ‘uint16_t’ {aka ‘int’} 103 | typedef u16 uint16_t; | ^~~~~~~~ In file included from /usr/include/stdint.h:37, from /usr/lib/gcc/x86_64-linux-gnu/11/include/stdint.h:9, from /usr/include/curses.h:95, from scripts/kconfig/lxdialog/dialog.h:19, from scripts/kconfig/mconf.c:23: /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h:26:20: error: conflicting types for ‘uint32_t’; have ‘__uint32_t’ {aka ‘unsigned int’} 26 | typedef __uint32_t uint32_t; | ^~~~~~~~ In file included from /usr/include/linux/limits.h:6, from /usr/include/x86_64-linux-gnu/bits/local_lim.h:38, from /usr/include/x86_64-linux-gnu/bits/posix1_lim.h:161, from /usr/include/limits.h:195, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:203, from /usr/lib/gcc/x86_64-linux-gnu/11/include/syslimits.h:7, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:34, from scripts/kconfig/mconf.c:14: /usr/include/linux/types.h:104:33: note: previous declaration of ‘uint32_t’ with type ‘uint32_t’ {aka ‘int’} 104 | typedef u32 uint32_t; | ^~~~~~~~ In file included from /usr/include/stdint.h:37, from /usr/lib/gcc/x86_64-linux-gnu/11/include/stdint.h:9, from /usr/include/curses.h:95, from scripts/kconfig/lxdialog/dialog.h:19, from scripts/kconfig/mconf.c:23: /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h:27:20: error: conflicting types for ‘uint64_t’; have ‘__uint64_t’ {aka ‘long unsigned int’} 27 | typedef __uint64_t uint64_t; | ^~~~~~~~ In file included from /usr/include/linux/limits.h:6, from /usr/include/x86_64-linux-gnu/bits/local_lim.h:38, from /usr/include/x86_64-linux-gnu/bits/posix1_lim.h:161, from /usr/include/limits.h:195, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:203, from /usr/lib/gcc/x86_64-linux-gnu/11/include/syslimits.h:7, from /usr/lib/gcc/x86_64-linux-gnu/11/include/limits.h:34, from scripts/kconfig/mconf.c:14: /usr/include/linux/types.h:107:33: note: previous declaration of ‘uint64_t’ with type ‘uint64_t’ {aka ‘int’} 107 | typedef u64 uint64_t; | ^~~~~~~~ make[2]: *** [scripts/Makefile.host:131:scripts/kconfig/mconf.o] 错误 1 make[1]: *** [/usr/src/linux-6.6.1/Makefile:697:menuconfig] 错误 2 make: *** [Makefile:234:__sub-make] 错误 2
最新发布
08-09
### 三级标题:解决 C++ 结构体重复定义导致的编译错误 `error C2011: 'StudentInfo' : struct type redefinition` 在 C++ 项目中,出现 `error C2011` 通常表示某个结构体(`struct`)被重复定义。这通常发生在多个源文件或头文件中未正确使用包含保护(include guards)或 `#pragma once`,导致编译器多次解析同一结构体定义。 #### 使用头文件保护宏防止重复定义 若结构体 `StudentInfo` 定义在某个头文件(如 `StudentInfo.h`)中,但未使用 `#ifndef`、`#define` 和 `#endif` 进行保护,或未使用 `#pragma once`,则在多个源文件中包含该头文件时,编译器将报错。应修改头文件如下: ```cpp // StudentInfo.h #pragma once struct StudentInfo { int id; char name[50]; float gpa; }; ``` 或者使用传统的头文件保护宏: ```cpp // StudentInfo.h #ifndef STUDENTINFO_H #define STUDENTINFO_H struct StudentInfo { int id; char name[50]; float gpa; }; #endif // STUDENTINFO_H ``` 上述方法可有效避免结构体被多次定义,从而解决 `C2011` 错误[^1]。 #### 确保结构体仅在一处定义 若 `StudentInfo` 结构体在多个头文件或源文件中分别定义,即使结构体内容相同,编译器也会将其视为重复定义。应确保结构体定义仅存在于一个头文件中,并通过 `#include` 引入该头文件到其他使用该结构体的文件中。 #### 检查命名空间和类成员结构体冲突 若 `StudentInfo` 是某个类或命名空间的内部结构体,且在全局作用域中再次定义,也可能导致冲突。应确保结构体的作用域一致,并避免在不同作用域下重复定义相同名称的结构体。 #### 使用预编译头文件统一结构体定义 若项目使用预编译头文件(如 `stdafx.h` 或 `pch.h`),可将结构体定义放入预编译头文件中,以确保所有源文件在编译时都能统一识别该结构体,避免因定义顺序不同导致的重复定义错误。 --- ```cpp // stdafx.h #pragma once #include "targetver.h" #define WIN32_LEAN_AND_MEAN #include <windows.h> // 统一定义结构体 struct StudentInfo { int id; char name[50]; float gpa; }; ``` ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值