2011-06-07 53 views
0

我正在开发我的Pro * C代码中的DEBUG消息打印功能。我在下面的行收到错误:Linux上的va_arg错误i386

fmt = va_arg(args, char *); 

的错误是如下:

Syntax error at line 672, column 40, file commonutil_x.pc: 
Error at line 672, column 40 in file commonutil_x.pc 
      fmt = va_arg(args, char *); 
.......................................1 
PCC-S-02201, Encountered the symbol ")" when expecting one of the following: 

    (* & + - ~ !^++ -- ... sizeof, an identifier, 
    a quoted string, a numeric constant, 
The symbol "..." was substituted for ")" to continue. 

我的机器的操作系统信息如下:

Linux Babo 2.6.9-89.ELsmp #1 SMP Mon Apr 20 10:34:33 EDT 2009 i686 i686 i386 GNU/Linux 

但我在写相同的代码一个小型的C程序,它被编译和工作。 任何人都可以告诉我为什么它不能在Pro * C中工作吗? 也编译我的更大的Pro * C程序在x86_64 linux机器上,它编译时没有任何错误。以下是有关第二台机器的完整信息:

Linux Habo 2.6.18-128.el5 #1 SMP Wed Dec 17 11:41:38 EST 2008 x86_64 x86_64 x86_64 GNU/Linux 

请帮我,为什么它是工作在x86_64,而不是工作在i386?

+0

第二个猜测:坏的安装和Pro * C没有得到va_arg定义,因此认为它是一个函数而不是宏? – AProgrammer 2011-06-07 14:07:29

+0

非常感谢AProgrammer的回复。你的意思是gcc没有正确安装或Pro * C?就像在我的测试c程序中一样。让我做一个小型的测试Pro * C程序,然后我会与你分享结果。 – QMG 2011-06-07 14:08:37

+0

你有什么要包括定义va_arg? – Jay 2011-06-07 14:11:20

回答

0

鉴于您已经混淆了32位Pro * C预编译器而不是64位版本,您可能在Pro * C预编译器中遇到了一个错误。

建议:将出现错误的日志记录功能移到单独的纯C源文件中,并在没有Pro * C编译器的情况下编译该文件。

考虑到错误消息的性质,另一种选择是用普通类型名称替换char *。很明显,Pro * C预编译器期望*是乘法符号而不是类型名称的一部分。

typedef char *charptr; 

fmt = va_arg(args, charptr); 

在我看来,这不如分离汇编。

我不确定它是否可行(并且它很可能不是合理的),但是可以考虑在将源提交给Pro * C预编译器之前通过源运行C预处理器。不推荐,但它可能会解决问题。

+0

谢谢乔纳森的回复。我已经在纯C源文件中测试了日志记录功能。它会被编译和工作。 – QMG 2011-06-07 14:16:08

+0

我尝试了以上建议。现在我得到了如下不同的错误:make:*** [commonutil_x.o]错误1 – QMG 2011-06-07 14:52:44

+0

@Qumer:在make错误消息中没有足够的信息可以诊断出错。从表面上看,即使在删除日志记录功能之后,仍然存在将'commonutil_x.pc'文件编译成目标文件的问题。 – 2011-06-07 15:15:14