<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 33.13\. C++應用程序 ECPG對C++應用程序有一些有限的支持。本節介紹一些注意事項。 `ecpg`預處理程序采取寫入C(或者類似C)的輸入文件,并且 嵌入SQL命令,將嵌入SQL命令轉換為C語言塊, 最后生成`.c`文件。 當在C++中使用時, 通過`ecpg`產生的C語言塊使用的庫函數的頭文件聲明 被包裹在`extern "C" { ... }`塊中。 因此他們應該在C++中無縫工作。 一般情況下,然而,`ecpg`預處理器僅僅了解C;它 不處理特殊語法并且保留C++語言關鍵字。因此, 寫入使用復雜特定C++功能的C++應用程序代碼的一些嵌入SQL代碼可能 不能正確地被預處理或者可能不會按預期的工作。 在C++應用程序中使用嵌入SQL代碼的安全方式是在C模塊中隱藏ECPG調用, 其中C++應用程序代碼調用訪問數據庫,并且連同C++代碼其余部分一起連接。 參閱[Section 33.13.2](#calibre_link-2016)獲取關于它的更多信息。 ## 33.13.1\. 宿主變量范圍 `ecpg`預處理器理解C中變量范圍。在C語言中, 這是簡單地因為變量范圍基于他們的代碼塊。在C++中, 然而,類成員變量參考來自聲明位置的不同代碼塊。 因此`ecpg`預處理程序不理解類成員變量的范圍。 比如,在下面情況下,`ecpg`預處理器無法找到 `test`方法中變量`dbname`的任何聲明, 因此產生錯誤。 ``` class TestCpp { EXEC SQL BEGIN DECLARE SECTION; char dbname[1024]; EXEC SQL END DECLARE SECTION; public: TestCpp(); void test(); ~TestCpp(); }; TestCpp::TestCpp() { EXEC SQL CONNECT TO testdb1; } void Test::test() { EXEC SQL SELECT current_database() INTO :dbname; printf("current_database = %s\n", dbname); } TestCpp::~TestCpp() { EXEC SQL DISCONNECT ALL; } ``` 這個代碼將產生類似這樣的錯誤。 ``` <kbd class="literal">ecpg test_cpp.pgc</kbd> test_cpp.pgc:28: ERROR: variable "dbname" is not declared ``` 為了避免這個范圍問題,`test`方法可以改為使用局部變量作為 中間存儲器。但是這個方法僅僅是一個低劣的解決辦法,因為 它丑化代碼并且降低性能。 ``` void TestCpp::test() { EXEC SQL BEGIN DECLARE SECTION; char tmp[1024]; EXEC SQL END DECLARE SECTION; EXEC SQL SELECT current_database() INTO :tmp; strlcpy(dbname, tmp, sizeof(tmp)); printf("current_database = %s\n", dbname); } ``` ## 33.13.2\. C++應用程序開發與外部C模塊 如果你理解C++中`ecpg`預處理器的這些技術局限性, 你可能得到這樣的結論在鏈接階段鏈接中C對象與C++對象使得C++應用程序 使用ECPG功能可能好于在C++代碼中直接寫一些嵌入SQL命令。 已經創建三種文件:一個C文件(`*.pgc`), 頭文件和C++文件: `test_mod.pgc` 執行SQL命令的子程序模塊嵌入C中。它將通過預處理器被轉換為 `test_mod.c`。 ``` #include "test_mod.h" #include &lt;stdio.h&gt; void db_connect() { EXEC SQL CONNECT TO testdb1; } void db_test() { EXEC SQL BEGIN DECLARE SECTION; char dbname[1024]; EXEC SQL END DECLARE SECTION; EXEC SQL SELECT current_database() INTO :dbname; printf("current_database = %s\n", dbname); } void db_disconnect() { EXEC SQL DISCONNECT ALL; } ``` `test_mod.h` C模塊中(`test_mod.pgc`)使用函數聲明的頭文件通過 `test_cpp.cpp`被包含。 這個文件在聲明周圍有一個`extern "C"`塊,因為 它將從C++模塊鏈接。 ``` #ifdef __cplusplus extern "C" { #endif void db_connect(); void db_test(); void db_disconnect(); #ifdef __cplusplus } #endif ``` `test_cpp.cpp` 該應用程序主要代碼,包含`main`程序和例子中C++類。 ``` #include "test_mod.h" class TestCpp { public: TestCpp(); void test(); ~TestCpp(); }; TestCpp::TestCpp() { db_connect(); } void TestCpp::test() { db_test(); } TestCpp::~TestCpp() { db_disconnect(); } int main(void) { TestCpp *t = new TestCpp(); t-&gt;test(); return 0; } ``` 為了編譯應用程序,如下進行。 通過運行`ecpg`, 轉換`test_mod.pgc`到`test_mod.c`, 使用C編譯器通過編譯`test_mod.c`產生`test_mod.o`。 ``` ecpg -o test_mod.c test_mod.pgc cc -c test_mod.c -o test_mod.o ``` 下一步,使用C++編譯器通過編譯`test_cpp.cpp`、 生成`test_cpp.o`。 ``` c++ -c test_cpp.cpp -o test_cpp.o ``` 最后,鏈接這些對象文件,`test_cpp.o` 和`test_mod.o`到一個可執行文件中,使用C++編譯器驅動: ``` c++ test_cpp.o test_mod.o -lecpg -o test_cpp ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看