2013-08-16 55 views
0

我是新來的一個項目,我們正在使用Oracle 10gC++。要連接到DB我們正在使用Pro*c。當我檢查代碼時,我發現一行與C++沒有任何關係。不能理解這個#define的使用

#define SQLCA_STORAGE_CLASS extern 

我谷歌認爲,發現Oracle文件http://docs.oracle.com/cd/B10501_01/appdev.920/a97269/pc_09err.htm,其狀態......

如果符號SQLCA_STORAGE_CLASS定義,那麼SQLCA將被定義爲有這樣的存儲類 。例如:

#define SQLCA_STORAGE_CLASS extern 

will define the SQLCA as an extern. 

所以我的問題......

  1. 什麼是該行的確切含義是什麼?
  2. 根據文件可以#define有能力提供存儲?
  3. 我們可以在我們的C/C++代碼中使用這個技巧嗎?

我知道我對這個問題的介紹不是很好,但我真的很想知道我們可以在C/C++代碼中使用這個技巧作爲訣竅。

編輯: 開始OG .cpp文件

#pragma warning(disable:4786) 
#define SQLCA_STORAGE_CLASS extern 
#include <sqlda.h> 
#include <sqlca.h> 
#include <sys/time.h> 

注:我想在這裏補充Pro*C標籤,但我無法找到。請爲此創建一個標籤。

+0

代碼中使用了'SQLCA_STORAGE_CLASS',你可以舉一個例子嗎? –

+0

@MatsPetersson ...我更新了..請檢查...... – someone

+0

我詢問它在哪裏被使用,而不是它被定義的位置(但是,給出的答案可能是正確的 - 但沒有看到它的確切代碼使用,它可能意味着幾乎任何東西)。但它並不是「提供存儲」。 –

回答

0

這個SQLCA_STORAGE_CLASS是一個宏,在編譯的預處理階段將被替換爲extern。它所做的一切,就是給你預先配備的物品SQLCA_STORAGE_CLASS所謂的「外部連接」。
這意味着您聲明瞭一個符號,但該定義可能位於不同的源文件中。所以最終鏈接器必須在頭文件或源文件中找到該符號的定義。
簡單的例子:

SQLCA_STORAGE_CLASS int item; 

extern int item; 

預處理後,這是一個定義,所以這個名字item是在編譯時可見。最終,鏈接器將把正確的項目放在那裏。

MSDN

extern關鍵字聲明一個變量或函數並指定其具有外部鍵(它的名字是從不同於它的定義的一個其它的文件可見)。當修改變量時,extern指定該變量具有靜態持續時間(當程序開始時分配,當程序結束時釋放)。變量或函數可以在另一個源文件中定義,或稍後在同一個文件中定義。默認情況下,文件範圍內變量和函數的聲明是外部的。

1

該行的確切含義是什麼?

#define SQLCA_STORAGE_CLASS extern的確切含義是,它會編譯之前extern更換SQLCA_STORAGE_CLASS

根據文檔可以#define是否有能力提供存儲?

該文件不談論存儲,而是storage classextern in C++ is a storage class specifier

我們可以在我們的C/C++代碼中使用這個技巧嗎?

究竟是什麼騙局? :)

1

我捕捉到一行與C++完全不相關的行。

#define SQLCA_STORAGE_CLASS extern

犯錯。這是標準的C++。請閱讀任何關於該語言的書。

  1. 它是一個預處理器命令
  2. 它用來提供一個存儲類爲每個文檔。您可以製作它extern,staticconst(或任何有效的組合)。
  3. 如果您希望維護代碼,請勿使用技巧。尤其不是你明顯不瞭解的。
+0

@TomTanner ......謝謝......除非我知道,否則我沒有使用任何技巧。當我什麼都不知道的時候,我來到這裏尋求像你和所有極客們一樣的專家建議。 – someone

0

這只是說在這裏,在包含的「oraca.h」標題中,全局sqlca將被視爲外部。 其結果是你必須在別處聲明它是靜態的。