【问题标题】:couldnt understand the use of this #define无法理解这个#define 的用法
【发布时间】:2013-08-16 11:17:39
【问题描述】:

我是一个项目的新手,我们正在使用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 标签,但我找不到。请为此创建一个标签。

【问题讨论】:

  • 代码中SQLCA_STORAGE_CLASS在哪里,你能举个例子吗?
  • @MatsPetersson...我更新了...请检查...
  • 我询问了它的使用位置,而不是它的定义位置(但是,给出的答案可能是正确的 - 但没有看到使用它的确切代码,它可能意味着几乎任何东西)。但是,它不“提供存储”。

标签: c++ oracle10g storage


【解决方案1】:

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

#define SQLCA_STORAGE_CLASS extern的确切含义是在编译前将SQLCA_STORAGE_CLASS替换为extern

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

该文档没有谈论存储,而是storage classextern 在 C++ 中是 storage class specifier

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

究竟是什么伎俩? :)

【讨论】:

    【解决方案2】:

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

    #define SQLCA_STORAGE_CLASS extern

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

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

    【讨论】:

    • @TomTanner...谢谢...在我知道之前我没有使用任何技巧。当我什么都不知道的时候,我来这里寻求像你和所有极客一样的专家建议。
    【解决方案3】:

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

    SQLCA_STORAGE_CLASS int item;
    

    将是

    extern int item;
    

    经过预处理,这是一个定义,因此名称item 在编译期间可见。最终链接器会将正确的项目放在那里。

    来自MSDN

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2019-09-06
        • 2015-04-05
        • 1970-01-01
        • 1970-01-01
        • 2018-09-09
        • 2012-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多