【问题标题】:error C3861: '_tcsdup': identifier not found错误 C3861:“_tcsdup”:找不到标识符
【发布时间】:2013-03-01 20:30:20
【问题描述】:

这是我第一次,我想使用 windows CreateProcess 函数进行并行处理。基于 MSDN 上的示例,我创建了一个像这样的 LPTSTR "(non-const) TCHAR string" command line 参数

LPTSTR szCmdline[] = _tcsdup(TEXT("\C:\\MyProgram_linux_1.1\\MyProgram.exe") );

LPTSTR 和其他char and string types are discussed here

命令行参数像这样传递给CreateProcess

if (!CreateProcess(NULL, szCmdline, /*...*/) ) cout << "ERROR: cannot start CreateProcess" << endl;

这些标题都存在

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <strsafe.h>
#include <direct.h>

编译时出现以下错误:

error C3861: '_tcsdup': identifier not found

搜索这个错误发现the same error but the solution was specific to using a .NET framework而不是解释error C3861: '_tcsdup'

不确定是否相关,但if (!CreateProcess(NULL, szCmdline, /*...*/) ) cout &lt;&lt; "ERROR: cannot start CreateProcess" &lt;&lt; endl; 上还有一个error C2059: syntax error : ')'

如何解决此错误?而且,这是怎么回事?

另外,我正在使用CreateProcess as a learning step towards learning the Linux fork() 函数 - Visual Studio 界面对我来说更易于使用,一旦调试并工作,我将更改为 g++ 界面并更改为 fork() 并从那里调试 -因此,如果可能,导致fork() 的解决方案是最有益的。

【问题讨论】:

  • 您需要#include &lt;tchar.h&gt;(或将_tcsdup 更改为strdup 并停止使用T 宏)。
  • 哇...你用CreateProcess来学习fork?为什么不直接学习fork?这些是非常不同的野兽。
  • forkCreateProcess 唯一的共同点是它们都是函数......修补 CreateProcess 与学习法语一样可能帮助您理解 fork可能会帮助你说日语。
  • 是的,但我在网上找到的所有内容都表明 CreateProcess 是 windows 与 fork() 最接近的东西 - 在问题源中引用。我确信在我的代码中存在必须修复的并行处理的一般问题,我想在 Visual Studio 中修复这些全局并行处理问题,然后在 g++ 中修复fork() 特定问题;如果我走错了方向 - 请指出我的正确
  • @forest.peterson:他们必须在某种程度上关注所有字符类型的源兼容性。曾几何时,schizo char 类型是常态,因为有些系统不支持 Unicode 或其他一些原因坚持使用 8 位字符。除此之外,有些人在某种程度上使用了所有这些,并且拥有三个仅在 char 类型上有所不同的示例是一种浪费。您不必真正关心;您的代码可以决定是否使用宽字符、MBCS 或 ANSI,以及它应该使用的 IMO。

标签: c++ visual-studio-2008 fork createprocess lptstr


【解决方案1】:

添加以下包括:

#include <tchar.h>

【讨论】:

  • error C2440: 'initializing' : 无法从 'wchar_t *' 转换为 'LPTSTR []'
  • 嗯。只需丢掉TCHARs 和TEXT("string")s 和_tcsdups 等。使用wchar_tL"string"wcsdup,或char"string"strdup。 schizo char 类型不再有令人信服的理由了。
  • 至于为什么你会得到那个错误,但是......LPTSTR stuff[] 不是你想要的。你想要some_char_type stuff[]some_char_type *stuff。第一个是给你一个指向字符串的指针数组。
  • @cHao char *cmdLine = strdup("\C:\\Daedalus_linu_1.1\\daedalus.exe 1 1" ); 这成功了
  • @forest.peterson:STARTUPINFO 是初始参数和其他内容,例如位置、大小、I/O 句柄等。PROCESSINFO 包含进程和线程 ID 以及新进程的句柄。见msdn.microsoft.com/en-us/library/windows/desktop/…msdn.microsoft.com/en-us/library/windows/desktop/…
【解决方案2】:

_tcsdup 是一个宏,根据您的 Unicode 设置映射到实现函数。由于您没有包含头文件(tchar.h),编译器认为它是一个符号并发出错误代码。

根据实际定位设置,_tcsdump 映射到其中之一:

  • _strdup
  • _mbsdup
  • _wcsdup

http://msdn.microsoft.com/en-us/library/y471khhc(v=vs.110).aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多