Используя Pro * C, как использовать структуру C ++ с конструктором, скопируйте конструктор в EXEC SQL BEGIN DECLARE SECTION - PullRequest
0 голосов
/ 08 ноября 2018

Я использую 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 build выглядит так:

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

Но, когда я компилирую, используя Pro * C Compiler, используя 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;

1 Ответ

0 голосов
/ 08 ноября 2018

Per документация , опция CODE=CPP указывает Pro C генерировать C ++, а не C. Он ничего не говорит о коде, который вы предоставляют это.

Вы можете изменить режим "разбора" на PARTIAL, чтобы разрешить синтаксис C ++ в предоставленном вами коде.

Для генерации кода, совместимого с C ++, параметр PARSE должен иметь значение NONE или PARTIAL. Если PARSE=FULL, то синтаксический анализатор C запускается и не понимает конструкции C ++ в вашем коде, такие как классы.

Странно, PARSE=PARTIAL предполагается по умолчанию, когда вы указали CODE=CPP, но это, похоже, не работает, как показывает ошибка:

Неустранимая ошибка при предварительной обработке C

& hellip; это должно быть невозможно, поскольку полная предварительная обработка C должна происходить только в режиме PARSE=FULL. Также смутно возможно, что парсер Pro C ++ сломан так, что он принимает функции-члены только в классе, определенном с ключевым словом class. Я говорю это только потому, что распространенное заблуждение состоит в том, что классы, определенные с ключевым словом struct, не могут содержать такие вещи & mdash; Вы можете попытаться изменить свой код, чтобы увидеть, не ошиблись ли авторы парсера.

...