C ++ 64位中的va_list

时间:2012-03-27 07:50:30

标签: c++ visual-studio-2005 64-bit variadic-functions

我使用VS2500,现在我想在x64位下编译我的应用程序,但编译器显示错误:

error C3861: '_INTSIZEOF': identifier was not found

我能做些什么来解决它?

3 个答案:

答案 0 :(得分:1)

您必须包含<stdarg.h>才能使用va_list

这将为_INTSIZEOF带来必要的定义。


实际上,仔细观察一下 - 在编译x64(或amd64)时,VS 2005在其_INTSIZE实现中似乎没有使用stdarg.h。生成错误的代码行是什么,并且您确定您为x64构建正确配置了项目吗?

我特别关注包含文件路径(设置/showIncludes选项可能会指出插入错误标头的问题)。您的构建应该从<:p>获取stdarg.hvadefs.h

Microsoft Visual Studio 8\VC\include

答案 1 :(得分:0)

似乎你的编译器最初不支持这个MACRO,所以你可能会尝试在你的代码前面添加这些: #define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )

答案 2 :(得分:0)

右。问题是我在我的例程中使用“va_start”,更具体地说是“http://www.codeproject.com/Articles/4181/Variable-Argument-Functions?msg=4204968#xx4204968xx”解决方案给出的完美解决方案在Win32中,但在x64上不允许使用__ asm。  例如:

# define va_start (ap, v) {int var = _INTSIZEOF (v); __ asm read eax, v add eax __ asm, __ asm mov var ap, eax}

 float add (float &x, ...) {

 va_list list;
 va_start (list, x);

 float result = 0;

 for (;;)
 {
 float p = (float) va_arg (list, double);
 if (p == 0)
 break;
 result + = p;

 }
 va_end (list);
 return result;

 }

 int main () {

 float hh = 2.1;
 cout << "Result is" << add (/ * 2.1 * / hh, 4.3,6.8);
 return 0;

 }

现在我遇到了__ asm在x64上不起作用的问题,但如果删除“&amp;”我可以解决它喜欢:  “float add(float x,...){”