我是一个项目的新手,我们正在使用Oracle 10g
和C++
。对于与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.
所以我的问题......
#define
能否提供存储?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 :(得分:1)
该行的确切含义是什么?
#define SQLCA_STORAGE_CLASS extern
的确切含义是在编译之前它会用SQLCA_STORAGE_CLASS
替换extern
。
根据文件,#define能否提供存储?
该文档不涉及存储,而是storage class
。 C ++中的extern
是storage class specifier
我们可以在C / C ++代码中使用它吗?
究竟是什么伎俩? :)
答案 1 :(得分:1)
我抓到了一行与C ++完全无关的行。
#define SQLCA_STORAGE_CLASS extern
ERR。那是标准的C ++。请阅读有关该语言的任何书籍。
extern
,static
或const
(或任何有效组合)。答案 2 :(得分:0)
这个SQLCA_STORAGE_CLASS
是一个宏,在编译的预处理阶段将被extern
替换。它所做的就是给你前面加上SQLCA_STORAGE_CLASS
所谓的“外部联动”的项目
这意味着您声明了一个符号,但该定义可能位于不同的源文件中。因此,链接器最终必须在头文件或源文件中找到该符号的定义
简单的例子:
SQLCA_STORAGE_CLASS int item;
将是
extern int item;
在预处理之后这是一个定义,因此在编译期间可以看到名称item
。最终链接器会将正确的项目放在那里。
来自MSDN:
extern关键字声明一个变量或函数,并指定它具有外部链接(其名称可以从其定义的文件以外的文件中看到)。修改变量时,extern指定变量具有静态持续时间(在程序开始时分配,在程序结束时分配)。变量或函数可以在另一个源文件中定义,或者稍后在同一文件中定义。默认情况下,文件范围内的变量和函数声明是外部的。
答案 3 :(得分:0)
这只是意味着在包含的“oraca.h”标题中,全局sqlca
将被视为外部。
结果是你必须在其他地方声明它是静态的。