Pro*C/C++Oracle预编译器无法解析windows.h头文件的原因



我正在使用MSVC Ultimate 2012开发Windows Server 2008 R2 Standard(SP1)。我正试图为64位平台编译一个我的"C"项目(但问题似乎与目标无关)。该项目包括一个*.pc文件,必须由Pro*C/C++预编译器进行预编译。问题是,我无法预编译该文件。在解析windows.h头文件时,预编译失败。请帮助!!

更多详细信息:

1) 源文件:我的My.pc文件开始如下:

 #include <windows.h>
 #include <stdio.h>
 #include <stdlib.h>  
 #include <string.h>
 #include <time.h>
 #include <assert.h>
 #include <sqlca.h>
 #include <sqlcpr.h>
…..

注意:第一个#include <windows.h>就足以进行错误调用。

2) 配置文件:默认的pcscfg.cfg文件为空,项目配置文件my.cfg如下所示:

sys_include=(d:Progra~1Micros~2.0VCinclude,c:Progra~2WI3CF2~18.0Includeum,c:Progra~2WI3CF2~18.0Includeshared,$PROC11_ORACLE_HOMEPRECOMPPUBLIc)
sqlcheck=full
parse=FULL
define=_WIN64 (or without this line)

注:d:\Progra~1\Microsoft~2.0\VC\include=d:\Program Files\Microsoft Visual Studio 10.0\VC\include,c:\Progra~2\WI3CF2~1\8.0\include\um=c:\Program Files(x86)\Windows Kits\8.0\Incept\um,c:\Progra ~2\WI3CF2~1\8.0 \include\shared=c:\Program Files(x86。这些路径用于查找所有需要的头文件。

3) 命令行:我在自定义构建工具/常规选项中为my.pc文件定义了以下命令行:

$(PROC11_ORACLE_HOME)binproc config=.my.cfg iname=%(Filename).pc oname=.%(Filename).c include="$(MSDEV_HOME)vcinclude".

注意:$(MSDEV_HOME)=D:\Program Files\Microsoft Visual Studio 10.0。

4) 平台:MSVC平台设置为x64,但我在Win32中也获得了类似的结果。

5) 错误消息:如果my.cfg文件中包含define=_WIN64,则在预编译期间收到错误消息:

1>  Syntax error at line 46, column 1, file d:Progra~1Micros~2.0VCincludevadefs.h:
1>  Error at line 46, column 1 in file d:Progra~1Micros~2.0VCincludevadefs.h
1>  typedef unsigned __int64    uintptr_t;
1>  1
1>  **PCC-S-02201, Encountered the symbol "typedef" when expecting one of the following:**
1>     ; , = ( [
1>  The symbol ";" was substituted for "typedef" to continue.

6) 错误消息:如果my.cfg文件中的define=_WIN64未涉及,则在预编译期间收到错误消息:

1>  Syntax error at line 48, column 1, file d:Progra~1Micros~2.0VCincludevadefs.h:
1>  Error at line 48, column 1 in file d:Progra~1Micros~2.0VCincludevadefs.h
1>  typedef _W64 unsigned int   uintptr_t;
1>  1
1>  **PCC-S-02201, Encountered the symbol "typedef" when expecting one of the following:**
1>  ; , = ( [

7) 文件vadefs.h:vadefs.h头文件中的关键行如下所示:

 #ifndef _UINTPTR_T_DEFINED
 #ifdef  _WIN64
 typedef unsigned __int64    uintptr_t; (this is line no. 46)
 #else
 typedef _W64 unsigned int   uintptr_t; (this is line no. 48)
 #endif
 #define _UINTPTR_T_DEFINED
 #endif

问题是,为什么在标准的Microsoft头文件中预编译失败。宏中可能存在一些混乱,例如与_WIN64有关的内容?还是应该在配置文件中添加另一个宏?我读了很多讨论,但没有取得进展。任何想法都将不胜感激!

一般问题是Oracle 11 Pro*C的ANSI-C解析能力非常有限。

基本上,Oracle声称Pro*C能够解析ANSI-C源文件是在撒谎。

例如,它甚至不能解析以下内容:

  • for (int i=0; i<n; ++i)
  • C99风格的结构/数组初始化比简单的= {0}稍微复杂一点
  • 临时初始值设定项赋值

因此,当遇到如上所述的解析错误时,有以下选项:

  • 将其作为错误报告给Oracle
  • 解决方法,通过
    • 重构代码,使所有与windows.h相关的代码都在其自己的非.pc翻译单元中,该单元提供可以从.pc文件安全调用的函数,或者-
    • 用C预处理器条件结构(如#ifndef ORA_PROC#endif)保护#include <windows.h>指令及其所有使用-仅当Pro*C预处理文件时才定义ORA_PROC宏,而不是当C编译器编译生成的文件时-或-
    • 尝试Pro*C选项PARSE=PARTIALPARSE=NONE(默认值为PARSE=FULL)-请注意,这使得esql声明部分是强制性的(可能还会抑制其他有用的警告)-或-
    • 查看windows.h,并找到一些系统宏集,这些宏集默认由标准C编译器提供(但不是由Pro*C提供),并且当通过Pro*C DEFINE=选项提供时,会让Pro*C感到满意

相关内容

  • 没有找到相关文章

最新更新