C++ 在全局命名空间中找不到非标准 C 函数

标签 c++ c ace

我们有一个相当大的 C++ 项目,我现在正在将其迁移到 VS2010 并在此过程中更新一些库。到目前为止,一切都构建得很好,除了我得到(对我来说)很奇怪的错误,其中显然有许多(编辑: 非)标准 C 函数和符号未定义:

error C2039: 'strdup' : is not a member of '`global namespace''    ...\ACE_wrappers\ace\OS_NS_string.inl    222
...
error C2065: 'O_WRONLY' : undeclared identifier                    ...\ACE_wrappers\ace\OS_NS_unistd.inl    1057
...

这会影响我的以下功能和符号:

strdup      getcwd      O_WRONLY
putenv      swab        O_TRUNC
access      unlink      S_IFDIR
chdir       mkdir       S_IFREG
rmdir       tempnam     O_RDONLY
isascii

我试验过的 ACE 包含文件中的一部分是 strdup 部分,如下所示:

ACE_INLINE char *
ACE_OS::strdup (const char *s)
{
#  if (defined (ACE_LACKS_STRDUP) && !defined(ACE_STRDUP_EQUIVALENT)) \
  || defined (ACE_HAS_STRDUP_EMULATION)
  return ACE_OS::strdup_emulation (s);
#  elif defined (ACE_STRDUP_EQUIVALENT)
  return ACE_STRDUP_EQUIVALENT (s);
#  elif defined (ACE_HAS_NONCONST_STRDUP)
  return ::strdup (const_cast<char *> (s));
#else
  return ::strdup (s);
#  endif /* (ACE_LACKS_STRDUP && !ACE_STRDUP_EQUIVALENT) || ... */
}

上面和下面的其他函数有很多类似的部分,所有这些都编译得很好。

在我的例子中采用的路径是最后一条,即 return::strdup (s);。如果我在 ::strdup 上按 F12,VS 会将我带到 C 标准库的 string.h 中的声明。

如果我删除它构建的命名空间限定符,尽管 IntelliSense 告诉我它现在是一个递归调用,所以它可能无法工作。如果我将命名空间更改为 std::,我会收到大约 270 个更多 错误,这次来自其他几个项目。如果我将函数更改为 ::_strdup 它会构建。将 string.h 作为最开始的内容包含在内并没有任何改变。

(注意:“它构建”指的是“这个特定的编译器错误在那个位置消失了,但显然它仍然留下了关于其他函数的错误。)

这里我有点不知所措。我注意到许多较大的库要么在标准库之上构建自己的抽象,要么提供默认情况下不存在的东西,而这正是 ACE 和 ImageMagick 已经发生冲突的地方(在 typedefing ssize_t 但定义不兼容)。由于我们引入了相当多的库(我现在也没有确切的概述),这很可能是另一场冲突,由错误的包含顺序和类似的事情引起。 ACE 中的相同内容在同一解决方案的其他 项目中显然可以正常工作,这一事实也暗示了这一点。

至少有人知道我可以在这里寻找什么吗? /showIncludes 的构建日志只有 24k 行,所以我在那里看不到很多模式,除了 string.h 在有问题的 ACE header 之前被包含在内。

而且我不想修改库源代码,因为如果我们更新到较新的版本,那只会再次咬我们。

最佳答案

"a number of standard C functions and symbols are not defined"

strdup 不是标准的 C 函数。它是在 POSIX 中定义的,但不是在 C 或 C++ 中定义的。引用 MSDN :

These POSIX functions are deprecated beginning in Visual C++ 2005. Use the ISO C++ conformant _strdup, _wcsdup, _mbsdup instead.

在我看来,您列出的符号都不是标准 C 函数。

关于C++ 在全局命名空间中找不到非标准 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13607129/

相关文章:

c - 如何使用数组的元素?

c++ - 有没有基于ACE框架的开源服务器?

c++ - CMake 错误 : variable is NOTFOUND. ACE_INCLUDE_DIR(高级)

c++ - 在 Windows 上使用 -faddress-sanitizer 进行 Clang

c++ - 如何判断多边形顶点的顺序是顺时针还是逆时针?

c++ - Windows KMFD HelloWorld 驱动程序部署任务失败

c - K&R 练习 1-9 (C)

c++ - 在 Ubuntu 9.10 中编译 ACE

C++ 初始化非常大的常量数组,最佳实践

c++ - 如何用C连续输出计算开始后的秒数?