2009-09-03 98 views
0

我想使用Dev-C++(版本4.9.9.2)和它自带的标准编译器重新编译某人的旧C++项目(我认为g ++使用MinGW )在Windows XP专业版SP3 32位。在文件中的一个strsafe.h包括,当我尝试编译,我得到这个错误:在strsafe.h中的','标记之前的预期主表达式

expected primary-expression before ',' token 

,错误指向是strsafe.h(微软()库中的代码行头文件)全部看起来像这样:

hr = StringGetsExWorkerA(pszDest, cchDest, cbDest, NULL, NULL, 0); 

对于这些行中的每一行都有2个“期望的主表达式”错误。我发现this forum thread这表明NULL值未被正确识别,并建议我在strsafe.h之前包含<cstddef>。我这样做,它不起作用。此外,它似乎实际上定义了NULL,因为当我在包含strsafe.h之前'#define NULL 0'时,我得到一个错误,告诉我我正在重新定义它。

对不起,我不能提供任何更多的细节,但重现此错误的代码只是'#include <strsafe.h>',所以我真的不知道还有什么要说的。有谁知道可能会发生什么,以及我如何解决这个问题?

谢谢!

(我已经尝试下载最新版本的Microsoft平台SDK,所以我有一个先进的最新版本strsafe.h的)

+0

正在使用的SDK的版本是什么(strsafe.h的完整路径是什么)?我的Vista SDK拷贝没有提及StringGetsExWorkerA()。 – 2009-09-03 15:23:43

+0

似乎有一个类似的问题在一个单独的论坛上提到:http://forums1.avsim.net/index.php?S =&6bf19a616003413c15cf25212fde2352 = showtopic&244719 PID = 1617949&ST = 0&#entry1617949。论坛特别提到了strsafe.h和MinGW。你可以试试他们解决这个问题的方法吗? – reuben 2009-09-04 04:17:19

+0

我从这里下载了PSDK-x86版本:http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en#filelist(Windows®Server 2003 SP1平台SDK )。 strsafe.h的路径是“C:\ Program Files \ Microsoft Platform SDK \ Include \ strsafe.h”。 @Rueben:“解决方案”似乎是使用其他环境/编译器?我已经尝试过MSVC++,并且该项目还存在其他问题,但是您没有遇到我在此处询问的问题。 – Jordi 2009-09-04 07:49:07

回答

0

我不知道什么NULL被定义为?也许它不是0,它可能是任何东西(尽管如果有人将NULL定义为0以外的东西,那将会非常奇怪)。

请尝试以下操作,看看它是否有效。

#undef NULL 
#define NULL 0 
+0

在C中,NULL通常定义为(void *)0,尽管它在C++中是直的0。 – 2009-09-03 15:57:21

+0

这实际上工作。 (现在我还有其他问题,但是使用这两行代码解决了这个问题) – Jordi 2009-09-04 07:58:48

+0

@Tyler,在C或C++中不存在NULL。一些/大多数编译器可以将它定义为(void *)0或0,但绝对没有任何东西阻止任何定义NULL的头文件/库/第三方代码/编译器。 NULL不是标准的一部分,所以你不应该使用它 – Glen 2009-09-04 09:23:30

0

我最初的想法是至少有一个标识符尚未声明。

尝试以下操作:

  • 检查你的编译器文档生成预处理输出选项(和生成它)
  • 找到该行的预处理输出和
  • 依次对于每个标识符,搜索向后找到它的声明

您可能会发现标识符未声明,或者其中一个声明为类型而不是对象。

0

通过strsafe.h文件好像这个函数是一个内部酮(它是由#ifndef STRSAFE_LIB_IMPL .... #endif块包围)和它的缠功能,如StringCbGetsExAStringCbGetsExA或寻找。你不应该用这些吗?

+0

它几乎发生在所有功能上,除此之外,我甚至不认为我正在调用该功能。只包括库会导致编译失败。 – Jordi 2009-09-04 07:57:52

0

我认为你可能会在你的包含路径中混合使用SDK标头。检查你的包含路径;海湾合作委员会的“-H”选项将帮助您找出混合(如果有的话)正在发生什么。

+0

对不起,但我真的不知道如何。我正在使用Dev-Cpp环境的编译按钮,我不知道gcc被调用的其他参数。此外,我可能不会真的知道如何处理输出。 – Jordi 2009-09-04 07:56:44

+0

我对Dev-Cpp一无所知,所以我无法理解“如何”。但是如果并且当你得到这些信息,在最坏的情况下将它编辑成你的问题,这里的某个人可能会提供帮助。 – 2009-09-04 14:09:26

相关问题