ホスト変数を C++ クラスで使用する場合も、同じような状況が発生します。一般に、クラスを別のヘッダファイルで宣言すると便利です。たとえば、このヘッダファイルには、次のような my_class の宣言が含まれています。
typedef short a_bool; #define TRUE ((a_bool)(1==1)) #define FALSE ((a_bool)(0==1)) public class { long host_member; my_class(); // Constructor ~my_class(); // Destructor a_bool FetchNextRow( void ); // Fetch the next row into host_member } my_class; |
この例では、各メソッドは、Embedded SQL ソースファイルに実装されます。簡単な変数だけがホスト変数として使用されます。あるクラスのデータメンバーへのアクセスに、前の項で説明した方法を使用できます。
EXEC SQL INCLUDE SQLCA; #include "my_class.hpp" #if 0 // Because it ignores #if preprocessing directives, // SQLPP reads the following declaration. EXEC SQL BEGIN DECLARE SECTION; long this_host_member; EXEC SQL END DECLARE SECTION; #endif // Macro used by the C++ compiler only. #define this_host_member this->host_member my_class::my_class() { EXEC SQL DECLARE my_table_cursor CURSOR FOR SELECT int_col FROM my_table order by int_col; EXEC SQL OPEN my_table_cursor; } my_class::~my_class() { EXEC SQL CLOSE my_table_cursor; } a_bool my_class::FetchNextRow( void ) { // :this_host_member references this->host_member EXEC SQL FETCH NEXT AllRows INTO :this_host_member; return( SQLCODE != SQLE_NOTFOUND ); } void main( void ) { db_init( &sqlca ); EXEC SQL CONNECT "DBA" IDENTIFIED BY "SQL"; { my_class mc; // Created after connecting. while( mc.FetchNextRow() ) { printf( "%ld\n", mc.host_member ); } } EXEC SQL DISCONNECT; db_fini( &sqlca ); } |
この例では、SQL プリプロセッサに this_host_member
を宣言しますが、マクロで C++ がこの宣言を this->host_member
に変換します。この変換が行われないと、プリプロセッサはこの変数の型を知ることができません。C/C++ コンパイラは通常重複した宣言を黙認しません。#if
ディレクティブは、2 番目の宣言をコンパイラから隠しますが、SQL プリプロセッサからは見える状態を保ちます。
複数の宣言は便利ですが、各宣言が同じ型に同じ変数名を割り当てるようにしてください。プリプロセッサは、C 言語を完全に解析することができないため、宣言に従ってホスト変数がグローバルに認識されているとみなします。
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2013, SAP AG or an SAP affiliate company. - SAP Sybase SQL Anywhere 16.0 |