0

我是一个项目的新手,我们正在使用Oracle 10gC++. 为了连接到DB我们正在使用Pro*c. 当我检查该代码时,我发现一行与C++.

#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++代码中使用它作为一个技巧。

编辑:开始 .cpp 文件

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

注意:我想在Pro*C此处添加标签,但找不到。请为此创建一个标签。

4

4 回答 4

1

我发现一行与 C++ 完全无关。

#define SQLCA_STORAGE_CLASS extern

呃。那是标准的C++。请阅读任何有关该语言的书籍。

  1. 这是一个预处理器命令
  2. 它用于根据文档提供存储类。你可以把它做成extern, static, or const(或任何有效的组合)。
  3. 如果您希望代码可维护,请不要使用技巧。尤其是那些你明显不明白的。
于 2013-08-16T11:26:23.293 回答
1

那条线的确切含义是什么?

的确切含义#define SQLCA_STORAGE_CLASS extern是它将替换SQLCA_STORAGE_CLASSextern编译前。

根据文档,#define 是否有能力提供存储?

该文档没有谈论存储,而是谈论storage class. extern在 C++ 中是存储类说明符

我们可以在我们的 C/C++ 代码中使用它作为一个技巧吗?

究竟是什么伎俩?:)

于 2013-08-16T11:25:30.960 回答
0

这只是意味着在包含的“oraca.h”头文件中,全局sqlca将被视为外部的。结果是你必须在别处声明它是静态的。

于 2013-10-09T12:47:46.490 回答
0

SQLCA_STORAGE_CLASS是一个宏,将extern在编译的预处理阶段替换为。它所做的只是给你添加SQLCA_STORAGE_CLASS所谓的“外部链接”的项目。
这意味着您声明了一个符号,但定义可能位于不同的源文件中。所以最终链接器必须在头文件或源文件中找到该符号的定义。
简单的例子:

SQLCA_STORAGE_CLASS int item;

将会

extern int item;

在预处理之后,这是一个定义,所以item在编译过程中名称是可见的。最终链接器会将正确的项目放在那里。

来自MSDN

extern 关键字声明一个变量或函数,并指定它具有外部链接(它的名称在定义它的文件之外的文件中可见)。修改变量时,extern 指定变量具有静态持续时间(在程序开始时分配,在程序结束时释放)。变量或函数可以在另一个源文件中定义,或者稍后在同一文件中定义。默认情况下,文件范围内的变量和函数声明是外部的。

于 2013-08-16T11:25:23.660 回答