|
|
|
|
||||||
![]() |
|
|
LinkBack | Outils de la discussion |
|
|
#1 |
|
Messages: n/a
Hébergeur: |
I was looking at some open source code, and found something that I had never seen before: const struct ast_datastore_info dialed_interface_info = { .type ="dialed-interface", .destroy = dialed_interface_destroy, .duplicate = dialed_interface_duplicate, }; What the heck are those dotted variables (?) fields(?). I don't recall seeing that in the K&R. I include the full file below. -Ramon --------------- /* * Asterisk -- An open source telephony toolkit. * * Copyright (C) 1999 - 2007, Digium, Inc. * * Mark Michelson <mmichelson@digium.com> * * See http://www.asterisk.org for more information about * the Asterisk project. Please do not directly contact * any of the maintainers of this project for assistance; * the project provides a web site, mailing lists and IRC * channels for your use. * * This program is free software, distributed under the terms of * the GNU General Public License Version 2. See the LICENSE file * at the top of the source tree. */ /*! \file * * \brief globally-accessible datastore information and callbacks * * \author Mark Michelson <mmichelson@digium.com> */ #include "asterisk/global_datastores.h" #include "asterisk/linkedlists.h" static void dialed_interface_destroy(void *data) { struct ast_dialed_interface *di = NULL; AST_LIST_HEAD(, ast_dialed_interface) *dialed_interface_list = data; if (!dialed_interface_list) return; AST_LIST_LOCK(dialed_interface_list); while ((di = AST_LIST_REMOVE_HEAD(dialed_interface_list, list))) ast_free(di); AST_LIST_UNLOCK(dialed_interface_list); AST_LIST_HEAD_DESTROY(dialed_interface_list); ast_free(dialed_interface_list); } static void *dialed_interface_duplicate(void *data) { struct ast_dialed_interface *di = NULL; AST_LIST_HEAD(, ast_dialed_interface) *old_list; AST_LIST_HEAD(, ast_dialed_interface) *new_list = NULL; if(!(old_list = data)) return NULL; if(!(new_list = ast_calloc(1, sizeof(*new_list)))) return NULL; AST_LIST_HEAD_INIT(new_list); AST_LIST_LOCK(old_list); AST_LIST_TRAVERSE(old_list, di, list) { struct ast_dialed_interface *di2 = ast_calloc(1, sizeof(*di2) + strlen(di->interface)); if(!di2) { AST_LIST_UNLOCK(old_list); dialed_interface_destroy(new_list); return NULL; } strcpy(di2->interface, di->interface); AST_LIST_INSERT_TAIL(new_list, di2, list); } AST_LIST_UNLOCK(old_list); return new_list; } const struct ast_datastore_info dialed_interface_info = { .type ="dialed-interface", .destroy = dialed_interface_destroy, .duplicate = dialed_interface_duplicate, }; |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
Ramon F Herrera wrote:
[you posted to the wrong group] > I was looking at some open source code, and found something that I had > never seen before: > > const struct ast_datastore_info dialed_interface_info = { > .type ="dialed-interface", > .destroy = dialed_interface_destroy, > .duplicate = dialed_interface_duplicate, > }; > > > What the heck are those dotted variables (?) fields(?). I don't recall > seeing that in the K&R. > You won't. Its C99 syntax. -- Ian Collins. |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
On Dec 24, 11:07am, Ramon F Herrera <ra...@conexus.net> wrote:
> I was looking at some open source code, and found something that I had > never seen before: > > const struct ast_datastore_info dialed_interface_info = { > .type ="dialed-interface", > .destroy = dialed_interface_destroy, > .duplicate = dialed_interface_duplicate, > > }; > > What the heck are those dotted variables (?) fields(?). I don't recall > seeing that in the K&R. This is part of C99 syntax and those variables are designated initialisers. It makes it easier to track which fields are set during that initialization. It is not valid in C++ though. |
|
|
|
#4 |
|
Messages: n/a
Hébergeur: |
> > const struct ast_datastore_info dialed_interface_info = {
> > .type ="dialed-interface", > > .destroy = dialed_interface_destroy, > > .duplicate = dialed_interface_duplicate, > > This is part of C99 syntax and those variables are designated > initialisers. It makes it easier to track which fields are set during > that initialization. It is not valid in C++ though. If you need such a thing in C++, you have to use external configuration files (try http://harpoon.sourceforge.net; my project to be honest). I really wish it were a part of C++, as well as list literals; and not only for initialization. For example: draw_line( Point( x = 10, y = 25 ), Point( x = 50, y = 25 ) ); std::vector<int> list( { 1, 4, 5, 2 } ); |
|
|
|
#5 |
|
Messages: n/a
Hébergeur: |
On 2007-12-25 18:47, mczard@poczta.onet.pl wrote:
>> > const struct ast_datastore_info dialed_interface_info = { >> > .type ="dialed-interface", >> > .destroy = dialed_interface_destroy, >> > .duplicate = dialed_interface_duplicate, >> >> This is part of C99 syntax and those variables are designated >> initialisers. It makes it easier to track which fields are set during >> that initialization. It is not valid in C++ though. > > If you need such a thing in C++, you have to use external > configuration files (try http://harpoon.sourceforge.net; my project to > be honest). I really wish it were a part of C++, as well as list > literals; and not only for initialization. For example: The fact that C++ have constructors mitigates the problem slightly, and if that is not enough you can use comments. struct Point { Point(intx, int y); }; Point(/*x = */ 10, /*y = */ 25); > draw_line( Point( x = 10, y = 25 ), Point( x = 50, y = 25 ) ); > > std::vector<int> list( { 1, 4, 5, 2 } ); Will be in the next version of the standard, but with slightly different syntax. -- Erik Wikström |
|
|
|
#6 |
|
Messages: n/a
Hébergeur: |
Erik Wikström wrote:
> On 2007-12-25 18:47, mczard@poczta.onet.pl wrote: >>>> const struct ast_datastore_info dialed_interface_info = { >>>> .type ="dialed-interface", >>>> .destroy = dialed_interface_destroy, >>>> .duplicate = dialed_interface_duplicate, >>> This is part of C99 syntax and those variables are designated >>> initialisers. It makes it easier to track which fields are set during >>> that initialization. It is not valid in C++ though. >> If you need such a thing in C++, you have to use external >> configuration files (try http://harpoon.sourceforge.net; my project to >> be honest). I really wish it were a part of C++, as well as list >> literals; and not only for initialization. For example: > > The fact that C++ have constructors mitigates the problem slightly, and > if that is not enough you can use comments. > > struct Point { > Point(intx, int y); > }; > > Point(/*x = */ 10, /*y = */ 25); > > >> draw_line( Point( x = 10, y = 25 ), Point( x = 50, y = 25 ) ); The named parameter idiom might be useful, http://www.parashift.com/c++-faq-lit...html#faq-10.18 LR |
|
![]() |
| Outils de la discussion | |
|
|