Unusual C construct - What is it?

R

Ramon F Herrera

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 <[email protected]>
*
* 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 <[email protected]>
*/

#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,
};
 
I

Ian Collins

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.
 
A

Abhishek Padmanabh

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.
 
M

mczard

const struct ast_datastore_info dialed_interface_info = {
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 } );
 
E

Erik Wikström

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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,780
Messages
2,569,611
Members
45,278
Latest member
BuzzDefenderpro

Latest Threads

Top