From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: Re: [PATCH kvm-unit-tests 2/4] Introduce a C++ wrapper for the kvm APIs Date: Wed, 24 Nov 2010 19:35:38 +0200 Message-ID: <4CED4CEA.7080000@redhat.com> References: <1290595933-13122-1-git-send-email-avi@redhat.com> <1290595933-13122-3-git-send-email-avi@redhat.com> <50DD1E97-0ECD-41E6-B6F8-1D78AA4A4876@suse.de> <4CED2416.1040102@codemonkey.ws> <20101124154006.GE15111@redhat.com> <4CED344B.3030000@codemonkey.ws> <4CED3FE6.50900@redhat.com> <4CED41A0.8060003@redhat.com> <4CED4276.9090103@redhat.com> <4CED445E.30105@redhat.com> <4CED4629.2060804@redhat.com> <4CED4738.2020406@redhat.com> <4CED488D.40806@redhat.com> <4CED4B0E.3030805@codemonkey.ws> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: Jes Sorensen , Gleb Natapov , Alexander Graf , Marcelo Tosatti , kvm@vger.kernel.org To: Anthony Liguori Return-path: Received: from mx1.redhat.com ([209.132.183.28]:15782 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754541Ab0KXRfq (ORCPT ); Wed, 24 Nov 2010 12:35:46 -0500 In-Reply-To: <4CED4B0E.3030805@codemonkey.ws> Sender: kvm-owner@vger.kernel.org List-ID: On 11/24/2010 07:27 PM, Anthony Liguori wrote: > > The alternative in C is: > > struct file_operations { > void (*release)(void); > void (*read)(...); > void (*write)(...); > }; > > struct file { > struct file_operations *ops; > }; > > If I do: > > static file_operations posix_file_ops = { > .read = posix_file_read, > .write = posix_file_write, > }; > > struct posix_file { > struct file parent; > int fd; > }; > > void posix_file_init(struct posix_file *obj) > { > obj->parent.ops = posix_file_ops; > obj->fd = ...; > }; > > The compiler won't generate an error. Only upon a call to > file_release() will a null pointer dereference happens whereas in C++, > because this paradigm is structured in the language, the compiler can > help assist you. You forgot to mention: static void posix_file_read(struct file *_file, ...) { struct posix_file *file = container_of(_file, struct posix_file, parent); ... } Even more boilerplate and potential for error. But I think the worst thing about this is that it makes it hard to do the right thing, so people hack quick and dirty workarounds. C++ makes this pattern trivial (if : laden), so people are encouraged to use it. -- error compiling committee.c: too many arguments to function