为什么Pro * C / C ++ Oracle预编译器无法解析windows.h头文件?

时间:2013-08-27 12:17:34

标签: visual-studio-2012 win64 oracle-pro-c

我正在使用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~1\Micros~2.0\VC\include,c:\Progra~2\WI3CF2~1\8.0\Include\um,c:\Progra~2\WI3CF2~1\8.0\Include\shared,$PROC11_ORACLE_HOME\PRECOMP\PUBLIc)
sqlcheck=full
parse=FULL
define=_WIN64 (or without this line)

注意:d:\ Progra~1 \ Micros~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 \ Include \ um,c:\ Progra~2 \ WI3CF2~1 \ 8.0 \ Include \ shared = C:\ Program Files(x86)\ Windows Kits \ 8.0 \ Include \ shared,$ PROC11_ORACLE_HOME = d:\ oracle \ product \ 11.2.0 \ client_2。这些路径可以找到所有需要的头文件。

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

$(PROC11_ORACLE_HOME)\bin\proc config=.\my.cfg iname=%(Filename).pc oname=.\%(Filename).c include="$(MSDEV_HOME)\vc\include".

注意:$(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~1\Micros~2.0\VC\include\vadefs.h:
1>  Error at line 46, column 1 in file d:\Progra~1\Micros~2.0\VC\include\vadefs.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~1\Micros~2.0\VC\include\vadefs.h:
1>  Error at line 48, column 1 in file d:\Progra~1\Micros~2.0\VC\include\vadefs.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相关的东西?或者我应该在配置文件中添加另一个宏?我已经阅读了大量讨论但没有进展。任何想法都将非常感激!

1 个答案:

答案 0 :(得分:1)

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

基本上,当声称Pro * C能够解析ANSI-C源文件时,Oracle就撒谎了。

例如,它甚至无法解析像:

这样的东西
  • for (int i=0; i<n; ++i)
  • C99样式结构/数组初始化比简单= {0}更复杂
  • 临时初始化程序分配
  • ...

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

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