为什么在.cpp文件中包含 <string.h>会导致编译错误(而包含它 .h 文件是可以的)

Why including <string.h> in .cpp file causes compilation errors (while including it .h file is ok)

本文关键字:文件 错误 包含它 编译 包含 cpp lt string 为什么 gt      更新时间:2023-10-16

在使用

时,我有一个奇怪的编译错误:
#include <string.h>

.cpp文件:

/usr/include/string.h:47:8: error: ‘size_t’ has not been declared
        size_t __n) __THROW __nonnull ((1, 2));
        ^
/usr/include/string.h:50:56: error: ‘size_t’ has not been declared
 extern void *memmove (void *__dest, const void *__src, size_t __n)
                                                        ^
/usr/include/string.h:59:18: error: ‘size_t’ has not been declared
         int __c, size_t __n)
                  ^
/usr/include/string.h:66:42: error: ‘size_t’ has not been declared
 extern void *memset (void *__s, int __c, size_t __n) __THROW __nonnull ((1));    /usr/include/string.h:47:8: error: ‘size_t’ has not been declared
        size_t __n) __THROW __nonnull ((1, 2));
        ^
/usr/include/string.h:50:56: error: ‘size_t’ has not been declared
 extern void *memmove (void *__dest, const void *__src, size_t __n)
                                                        ^
/usr/include/string.h:59:18: error: ‘size_t’ has not been declared
         int __c, size_t __n)
                  ^
/usr/include/string.h:66:42: error: ‘size_t’ has not been declared
 extern void *memset (void *__s, int __c, size_t __n) __THROW __nonnull ((1));
                                          ^
/usr/include/string.h:69:56: error: ‘size_t’ has not been declared
 extern int memcmp (const void *__s1, const void *__s2, size_t __n)
                                          ^
/usr/include/string.h:69:56: error: ‘size_t’ has not been declared
 extern int memcmp (const void *__s1, const void *__s2, size_t __n)

将同一行代码放到。h文件中,不会产生任何错误。

我不明白,是什么问题

包含.h.cpp的标头之间是不可能有区别的。简直是不可能的。下次,发布一个测试用例(我不能强调这有多重要)。

但是,您可能在.cpp中包含一些其他头,它定义了size_t,从而掩盖了错误。是的,这是一个bug。标准头文件应该独立工作,显然,在你的实现中,这个不是。

然而,因为你应该包括c++ <cstring>,而不是C <string.h>,这是没有意义的。

如果你这样做了,仍然有问题,那么你把事情搞砸了。如果没有测试用例,我们无法判断这是什么

我不知道为什么你会得到这个错误,但一般来说,<string.h>的使用是不赞成的c++,所以虽然它经常工作,你不能指望它。<string>是c++头文件,包含在std命名空间中定义的string类。

<string.h>包含C字符串函数和定义。在c++中,如果你想要那些旧的函数,你应该使用<cstring>。我认为如果你在c++中混合了一些东西,你会得到命名空间问题等,这可能会导致你的错误。