为什么在.cpp文件中包含<string.h>会导致编译错误(包括它.h文件正常)

时间:2015-07-20 03:12:24

标签: c++

使用时出现奇怪的编译错误:

#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文件中放入相同的行代码,但不会出现任何错误。

我很困惑,问题是什么?

2 个答案:

答案 0 :(得分:1)

包含.h.cpp的标题之间不可能存在差异。几乎不可能。下次发布testcase(我不能强调这是多么重要)。

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

但是,既然你应该包括C ++ <cstring>,而不是C <string.h>,那就没有用了。

如果你这样做但仍有问题,那么你搞砸了。如果没有测试用例,我们无法分辨出它是什么。

答案 1 :(得分:0)

我并不确切知道你为什么会收到这个错误,但一般来说,<string.h>的使用已经弃用了C ++,所以尽管它经常有效,但你不能这样做期待它。 <string>是C ++标头,包含std命名空间中定义的字符串类。

<string.h>包含C字符串函数和定义。在C ++中,如果您需要这些旧功能,则应使用<cstring>。我认为如果你在C ++中混合使用,你会遇到名称空间问题,这可能会导致你的错误。