【问题标题】:Why including <string.h> in .cpp file causes compilation errors (while including it .h file is ok)为什么在 .cpp 文件中包含 <string.h> 会导致编译错误(而包含它 .h 文件是可以的)
【发布时间】:2015-07-20 03:12:23
【问题描述】:

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

#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 文件中时,不会出现任何错误。

我很困惑,有什么问题?

【问题讨论】:

  • 您需要更新您的问题以显示最小的测试用例。
  • 这将是由于依赖标题的顺序,但我们只能猜测,因为您没有显示任何来源。

标签: c++


【解决方案1】:

在此处包含来自.h 和来自.cpp 的标头之间不可能有区别。从字面上看是不可能的。下一次,发testcase(我无法强调这是多么重要)。

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

但是,由于您应该包含 C++ &lt;cstring&gt;,而不是 C &lt;string.h&gt;,因此没有实际意义。

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

【讨论】:

    【解决方案2】:

    我不知道您为什么会收到该错误,但一般来说,C++ 不推荐使用 &lt;string.h&gt;,因此尽管它经常有效,但您不能指望它会这样做。 &lt;string&gt; 是 C++ 标头,其中包含在 std 命名空间中定义的字符串类。

    &lt;string.h&gt; 包含 C 字符串函数和定义。在 C++ 中,如果您想要那些较旧的函数,您应该使用 &lt;cstring&gt;。我认为如果你在 C++ 中混合使用,你会遇到命名空间问题等,这可能会导致你的错误。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多