无法理解这个#define的用法

时间:2013-08-16 11:17:39

标签: c++ oracle10g storage

我是一个项目的新手,我们正在使用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++代码中使用此功能吗?
  4. 我知道我对这个问题的介绍并不好,但我真的想知道我们可以在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标记,但我找不到。请为此创建一个标记。

4 个答案:

答案 0 :(得分:1)

  

该行的确切含义是什么?

#define SQLCA_STORAGE_CLASS extern的确切含义是在编译之前它会用SQLCA_STORAGE_CLASS替换extern

  

根据文件,#define能否提供存储?

该文档不涉及存储,而是storage class。 C ++中的externstorage class specifier

  

我们可以在C / C ++代码中使用它吗?

究竟是什么伎俩? :)

答案 1 :(得分:1)

  

我抓到了一行与C ++完全无关的行。

     

#define SQLCA_STORAGE_CLASS extern

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

  1. 这是一个预处理程序命令
  2. 它用于根据文档提供存储类。您可以将其设为externstaticconst(或任何有效组合)。
  3. 如果您希望代码可维护,请不要使用技巧。尤其不是你明显不明白的人。

答案 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将被视为外部。 结果是你必须在其他地方声明它是静态的。