首页 > 解决方案 > 使用 Pro*C,如何使用带有构造函数的 C++ 结构,在 EXEC SQL BEGIN DECLARE SECTION 中复制构造函数

问题描述

我正在使用 Pro*C 版本 12.2.0.1.0。要在 SQL INSERT 语句中使用主机数组,我使用如下结构数组:

EXEC SQL BEGIN DECLARE SECTION;
struct XYZ {
    int adata;
    XYZ() {
        this->adata = 0;
    }
    XYZ(const XYZ& src) {
        this->adata = src.adata;
    }
    XYZ& operator =(const XYZ &src) {
        this->adata = src.adata;
        return *this;
    }
};
XYZ axyz[20];
EXEC SQL END DECLARE SECTION;

我的 pro*c 构建命令如下:

 proc code=cpp parse=partial 'include=(<list-of-comma-separated-include-folder-names>)' xyz.pc

但是,当我使用 Pro*C 编译器进行编译时,使用code=cpp, 如proc code=cpp. . . ,我收到如下错误:

Pro*C/C++: Release 12.2.0.1.0 - Production on Thu Nov 8 05:36:56 2018

Copyright (c) 1982, 2017, Oracle and/or its affiliates.  All rights reserved.

System default option values taken from: /app/oracle/product/12c/precomp/admin/pcscfg.cfg
Syntax error at line 64, column 2, file xyz.pc:
Error at line 64, column 2 in file xyz.pc
         XYZ() {
 .1
PCC-S-02201, Encountered the symbol "XYZ" when expecting one of the following:
   } char, const, double, enum, float, int, long, ulong_varchar,
 OCIBFileLocator OCIBlobLocator, OCIClobLocator, OCIDateTime,
 OCIExtProcContext, OCIInterval, OCIRowid, OCIDate, OCINumber,
 OCIRaw, OCIString, short, signed, sql_context, sql_cursor,
 struct, union, unsigned, utext, uvarchar, varchar, void,
 volatile, a typedef name,
 Syntax error at line 67, column 15, filexyz.pc
      XYZ(const XYZ& src) {
  ..............1
 PCC-S-02201, Encountered the symbol "&" when expecting one of the following:

  , ( ) [

 Error at line 0, column 0 in file xyz.pc
 PCC-F-02102, Fatal error while doing C preprocessing

我需要使用带有构造函数和复制构造函数的 C++ 结构来处理初始化,但是要让 Pro*C 编译器接受吗?允许以下声明,但我需要使用构造函数进行初始化:

EXEC SQL BEGIN DECLARE SECTION;
struct XYZ {
        int adata;
};
struct XYZ axyz[10];
EXEC SQL END DECLARE SECTION;

标签: c++oracleoracle12coracle-pro-c

解决方案


根据文档,该CODE=CPP选项告诉 Pro C生成C++ 而不是 C。它没有说明提供给它的代码。

您可以更改“解析”模式以PARTIAL允许在您提供的代码中使用 C++ 语法。

要生成 C++ 兼容代码,PARSE 选项必须为 NONE 或 PARTIAL。如果PARSE=FULL,则 C 解析器运行,并且它不理解代码中的 C++ 构造,例如类。

奇怪的PARSE=PARTIAL是,应该是您提供时的默认设置CODE=CPP,但这似乎不起作用,如错误所示:

进行 C 预处理时出现致命错误

…这应该是不可能的,因为完整的 C 预处理只应该在PARSE=FULL模式下发生。Pro C++ 解析器也很可能被破坏,以至于它只接受用关键字定义的类中的成员函数class。我这么说只是因为一个常见的误解是,用关键字定义的类struct不能包含这些东西——你可以尝试调整你的代码,看看解析器作者是否犯了这个错误。


推荐阅读