最后更新于 .

今天在翻unix网络编程的时候,无意中看到了使用匿名定义结构体/类定义数组的一段代码。

于是写了测试代码如下:

#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;

struct st
{
    int a;
    int b;
    char *p;
    int c;
}sts[]={
    {1,1,"hh",1},
    {2,2,"ff",2}
};

class CObj
{
    public:
        int a;
        string s;
        int b;

}objs[]={
    {1,"x",11},
    {2,"y",22}
};

int main(int argc, const char *argv[])
{
    for (int i = 0; i < 2; i++) {
        printf("%d,%d,%s,%d\n",(sts+i)->a,(sts+i)->b,(sts+i)->p,(sts+i)->c);
    }
    for (int i = 0; i < 2; i++) {
        printf("%d,%s,%d\n",(objs+i)->a,(objs+i)->s.c_str(),(objs+i)->b);
    }
}

运行结果如下:

1,1,hh,1
2,2,ff,2
1,x,11
2,y,22

整个调用过程中,都没有用st或者CObj显示创建任何参数,调用起来要简洁很多,简直比python还要简洁。

用python的代码来表示的话:

sts = (
    (1,1,"hh",1),
    (2,2,"ff",2)
)

但python不支持匿名类的定义,只能用下标来访问数据,这样看来倒是C的表现更好一些呢。

记录一下,有机会在项目中用一下。

Pingbacks

Pingbacks已打开。

Trackbacks

引用地址

评论

  1. 瑞士菜刀

    瑞士菜刀 on #

    话说「匿名」结构体/类是指不写明本身名称的结构体/类吧... 写了 struct st / class CObj 就不叫匿名了.

    struct { ... } sts[] = { ... };
    class { ... } objs[] = { ... };

    Reply

    1. Dante

      Dante on #

      确实如此,我在文中的说法不是很准确,呵呵。
      之前居然被自动过滤到垃圾评论里面去了。。

      Reply

    2. Dante

      Dante on #

      我刚才又试了一下:
      struct
      {
      int a;
      int b;
      char *p;
      int c;
      }sts[]={
      {1,1,"hh",1},
      {2,2,"ff",2}
      };

      class
      {
      public:
      int a;
      string s;
      int b;

      }objs[]={
      {1,"x",11},
      {2,"y",22}
      };

      把名字去掉,这样写也是没问题的。。。。

      Reply

  2. 依云

    依云 on #

    原来class也可以这么用啊,学习了。
    不过Python有namedtuple呀。另外, “都没有用st或者CObj显示创建任何参数”这里有错别字哦~

    Reply

    1. Dante

      Dante on #

      咦,我去研究下.哈,你看得好仔细呀,我改一下.

      Reply

  3. jackjiang

    jackjiang on #

    这。。。c专家编程那本书上写了呀,这是ansC的特性呀

    Reply

发表评论