【问题标题】:typedef for an array of structures with one char array as member for structuretypedef 用于结构数组,其中一个 char 数组作为结构的成员
【发布时间】:2014-03-24 13:51:35
【问题描述】:

我通常在oracle-pro *c/c++中通过

声明变量
VARCHAR myvar[25];

在我的文件预编译后更改为这样

typedef struct { unsigned short len; unsigned char arr[1]; } VARCHAR;
struct { unsigned short len; unsigned char arr[25]; } myvar;

由于在我们使用varchar myvar[25] 语句时为varchar 给出了typedef,

  1. 为什么它不创建结构数组myvar[25]
  2. typedef 语句中的arr[1] 如何在第二行更改为arr[25]

【问题讨论】:

  • 1) myvar :重复名称。
  • @BLUEPIXY 对不起。我抓不到你

标签: c++ c struct typedef oracle-pro-c


【解决方案1】:

从您展示的预编译代码中,我会说

VARCHAR myvar[25];

被解释为这样的 SQL

myvar varchar(25)

这也是生成的,注意char arr[25]

struct { unsigned short len; unsigned char arr[25]; } myvar;

【讨论】:

  • 如果真的要按照你上面说的来解释..这句话typedef struct { unsigned short len; unsigned char arr[1]; } VARCHAR; 有什么必要。请澄清。我想知道c中是否有任何这样的概念。如果是预编译器的工作就没有问题
  • 我不知道,VARCHAR typedef 是干什么用的。在 C 中,当您分配动态内存时,您可以使用这种最小的 typedef。您可以说p = malloc(sizeof(VARCHAR) + 14),它会在堆上为您提供大小为 14 的 varchar。但由于我既没有编写预编译器,也没有访问过预编译器的文档,所以我不能肯定。
【解决方案2】:
  1. myvar 是一个对象,它为字符 myvar.arr[25] 和字符串长度 myvar.len 的数组保留内存。它还需要什么?
  2. 那可能是struct hack。我猜它是用来创建通用 VARCHAR 指针的。

例子:

void PrintVarChar(VARCHAR * vcPtr) {
    for(unsigned short i; i < vcPtr->len; ++i) {
        PrintChar(vcPtr->arr[i]);
    }
}

这样称呼:

PrintVarChar((VARCHAR*)&myvar);

【讨论】:

  • Struct hack 很有趣...但它似乎是未定义的行为.. oracle 预编译器将如何使用未定义的行为?
  • 好吧,我并没有说这是一个好的和可移植的做法 :) 为什么 Oracle 使用它?只有他们知道。
猜你喜欢
  • 2016-09-18
  • 1970-01-01
  • 2020-04-20
  • 1970-01-01
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-14
相关资源
最近更新 更多