digitalmars.D.learn - Wrapping C that uses compiler extensions
- simendsjo <simen.endsjo pandavre.com> Mar 04 2011
- =?UTF-8?B?IkrDqXLDtG1lIE0uIEJlcmdlciI=?= <jeberger free.fr> Mar 04 2011
- simendsjo <simen.endsjo pandavre.com> Mar 04 2011
This code confuses me... It's from the c mysql windows dll, libmysql.dll.
size_t (*snprintf)(struct charset_info_st *, char *to, size_t n,
const char *fmt,
...) ATTRIBUTE_FORMAT_FPTR(printf, 4, 5);
#ifndef _my_attribute_h
#define _my_attribute_h
/*
Disable __attribute__() on gcc < 2.7, g++ < 3.4, and non-gcc compilers.
Some forms of __attribute__ are actually supported in earlier versions of
g++, but we just disable them all because we only use them to generate
compilation warnings.
*/
#ifndef __attribute__
# if !defined(__GNUC__)
# define __attribute__(A)
# elif GCC_VERSION < 2008
# define __attribute__(A)
# elif defined(__cplusplus) && GCC_VERSION < 3004
# define __attribute__(A)
# endif
#endif
/*
__attribute__((format(...))) is only supported in gcc >= 2.8 and g++
= 3.4
just a convenience macro.
*/
#ifndef ATTRIBUTE_FORMAT
# define ATTRIBUTE_FORMAT(style, m, n) __attribute__((format(style, m, n)))
#endif
/*
__attribute__((format(...))) on a function pointer is not supported
until gcc 3.1
*/
#ifndef ATTRIBUTE_FORMAT_FPTR
# if (GCC_VERSION >= 3001)
# define ATTRIBUTE_FORMAT_FPTR(style, m, n) ATTRIBUTE_FORMAT(style, m, n)
# else
# define ATTRIBUTE_FORMAT_FPTR(style, m, n)
# endif /* GNUC >= 3.1 */
#endif
#endif
Mar 04 2011
Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable simendsjo wrote:=20 This code confuses me... It's from the c mysql windows dll, libmysql.dl=
=20 size_t (*snprintf)(struct charset_info_st *, char *to, size_t n, const char *fmt, ...) ATTRIBUTE_FORMAT_FPTR(printf, 4, 5); =20
=80=9D. All it does is that it enables the compiler to check the format string against the variable arguments and generate a warning if they do not match. Jerome --=20 mailto:jeberger free.fr http://jeberger.free.fr Jabber: jeberger jabber.fr
Mar 04 2011
On 04.03.2011 22:42, "Jérôme M. Berger" wrote:int main(string[] args) { auto s1 =(); // MH MH auto s2 =(); // OK s2.c =ull; // OK return 0; }
Is part of your message gone?You can safely ignore the “ATTRIBUTE_FORMAT_FPTR(printf, 4, 5)”.
That I understood :) Thanks!
Mar 04 2011
Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable simendsjo wrote:On 04.03.2011 22:42, "J=C3=A9r=C3=B4me M. Berger" wrote:int main(string[] args) { auto s1 =3D(); // MH MH auto s2 =3D(); // OK s2.c =3Dull; // OK return 0; }
Is part of your message gone? =20
You can safely ignore the =E2=80=9CATTRIBUTE_FORMAT_FPTR(printf, 4, 5)=
=20 That I understood :) Thanks!
Then if the issue is with the rest of the definition, it is more or less equivalent to (you will need to translate the argument declaration too): alias size_t function (struct charset_info_st *, char *to, size_t n, const char *fmt, ...) snprintf; Jerome --=20 mailto:jeberger free.fr http://jeberger.free.fr Jabber: jeberger jabber.fr
Mar 04 2011
On 05.03.2011 08:58, "Jérôme M. Berger" wrote:simendsjo wrote:On 04.03.2011 22:42, "Jérôme M. Berger" wrote:int main(string[] args) { auto s1 =(); // MH MH auto s2 =(); // OK s2.c =ull; // OK return 0; }
Is part of your message gone?
Checked the web newsinterface, and I see your post. In thunderbird I got another post from Tom with the subject "Struct reference returning function and const members" in your post...You can safely ignore the “ATTRIBUTE_FORMAT_FPTR(printf, 4, 5)”.
That I understood :) Thanks!
Then if the issue is with the rest of the definition, it is more or less equivalent to (you will need to translate the argument declaration too): alias size_t function (struct charset_info_st *, char *to, size_t n, const char *fmt, ...) snprintf; Jerome
The definition is inside a struct. I shouldn't use an alias then..? This is the C struct: typedef struct my_charset_handler_st { // snip size_t (*snprintf)(struct charset_info_st *, char *to, size_t n, const char *fmt, ...) ATTRIBUTE_FORMAT_FPTR(printf, 4, 5); // snip } And this is my D struct: struct my_charset_handler_st { // snip size_t function(charset_info_st*, char* to, size_t n, const char* fmt, ...) snprintf; // snip }
Mar 05 2011
Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable simendsjo wrote:On 05.03.2011 08:58, "J=C3=A9r=C3=B4me M. Berger" wrote:simendsjo wrote:On 04.03.2011 22:42, "J=C3=A9r=C3=B4me M. Berger" wrote:int main(string[] args) { auto s1 =3D(); // MH MH auto s2 =3D(); // OK s2.c =3Dull; // OK return 0; }
Is part of your message gone?
Checked the web newsinterface, and I see your post. In thunderbird I go=
another post from Tom with the subject "Struct reference returning function and const members" in your post... =20You can safely ignore the =E2=80=9CATTRIBUTE_FORMAT_FPTR(printf, 4, =
That I understood :) Thanks!
Then if the issue is with the rest of the definition, it is more o=
less equivalent to (you will need to translate the argument declaration too): alias size_t function (struct charset_info_st *, char *to, size_t n, const char *fmt, ...) snprintf; Jerome
The definition is inside a struct. I shouldn't use an alias then..? =20
This is the C struct: typedef struct my_charset_handler_st { // snip size_t (*snprintf)(struct charset_info_st *, char *to, size_t n, const char *fmt, ...) ATTRIBUTE_FORMAT_FPTR(printf, 4, 5); // snip } =20 And this is my D struct: struct my_charset_handler_st { // snip size_t function(charset_info_st*, char* to, size_t n, const char* fmt, ...) snprintf; // snip }
Jerome --=20 mailto:jeberger free.fr http://jeberger.free.fr Jabber: jeberger jabber.fr
Mar 05 2011








=?UTF-8?B?IkrDqXLDtG1lIE0uIEJlcmdlciI=?= <jeberger free.fr>