diff --git a/contrib/hstore/hstore.h b/contrib/hstore/hstore.h index 6303fa4061..6bab08b7de 100644 --- a/contrib/hstore/hstore.h +++ b/contrib/hstore/hstore.h @@ -194,7 +194,7 @@ extern Pairs *hstoreArrayToPairs(ArrayType *a, int *npairs); #if HSTORE_POLLUTE_NAMESPACE #define HSTORE_POLLUTE(newname_,oldname_) \ PG_FUNCTION_INFO_V1(oldname_); \ - extern PGDLLEXPORT Datum newname_(PG_FUNCTION_ARGS); \ + Datum newname_(PG_FUNCTION_ARGS); \ Datum oldname_(PG_FUNCTION_ARGS) { return newname_(fcinfo); } \ extern int no_such_variable #else diff --git a/contrib/ltree/ltree.h b/contrib/ltree/ltree.h index c7aa7f8818..c604357dbf 100644 --- a/contrib/ltree/ltree.h +++ b/contrib/ltree/ltree.h @@ -130,30 +130,30 @@ typedef struct /* use in array iterator */ -extern PGDLLEXPORT Datum ltree_isparent(PG_FUNCTION_ARGS); -extern PGDLLEXPORT Datum ltree_risparent(PG_FUNCTION_ARGS); -extern PGDLLEXPORT Datum ltq_regex(PG_FUNCTION_ARGS); -extern PGDLLEXPORT Datum ltq_rregex(PG_FUNCTION_ARGS); -extern PGDLLEXPORT Datum lt_q_regex(PG_FUNCTION_ARGS); -extern PGDLLEXPORT Datum lt_q_rregex(PG_FUNCTION_ARGS); -extern PGDLLEXPORT Datum ltxtq_exec(PG_FUNCTION_ARGS); -extern PGDLLEXPORT Datum ltxtq_rexec(PG_FUNCTION_ARGS); -extern PGDLLEXPORT Datum _ltq_regex(PG_FUNCTION_ARGS); -extern PGDLLEXPORT Datum _ltq_rregex(PG_FUNCTION_ARGS); -extern PGDLLEXPORT Datum _lt_q_regex(PG_FUNCTION_ARGS); -extern PGDLLEXPORT Datum _lt_q_rregex(PG_FUNCTION_ARGS); -extern PGDLLEXPORT Datum _ltxtq_exec(PG_FUNCTION_ARGS); -extern PGDLLEXPORT Datum _ltxtq_rexec(PG_FUNCTION_ARGS); -extern PGDLLEXPORT Datum _ltree_isparent(PG_FUNCTION_ARGS); -extern PGDLLEXPORT Datum _ltree_risparent(PG_FUNCTION_ARGS); +Datum ltree_isparent(PG_FUNCTION_ARGS); +Datum ltree_risparent(PG_FUNCTION_ARGS); +Datum ltq_regex(PG_FUNCTION_ARGS); +Datum ltq_rregex(PG_FUNCTION_ARGS); +Datum lt_q_regex(PG_FUNCTION_ARGS); +Datum lt_q_rregex(PG_FUNCTION_ARGS); +Datum ltxtq_exec(PG_FUNCTION_ARGS); +Datum ltxtq_rexec(PG_FUNCTION_ARGS); +Datum _ltq_regex(PG_FUNCTION_ARGS); +Datum _ltq_rregex(PG_FUNCTION_ARGS); +Datum _lt_q_regex(PG_FUNCTION_ARGS); +Datum _lt_q_rregex(PG_FUNCTION_ARGS); +Datum _ltxtq_exec(PG_FUNCTION_ARGS); +Datum _ltxtq_rexec(PG_FUNCTION_ARGS); +Datum _ltree_isparent(PG_FUNCTION_ARGS); +Datum _ltree_risparent(PG_FUNCTION_ARGS); /* Concatenation functions */ -extern PGDLLEXPORT Datum ltree_addltree(PG_FUNCTION_ARGS); -extern PGDLLEXPORT Datum ltree_addtext(PG_FUNCTION_ARGS); -extern PGDLLEXPORT Datum ltree_textadd(PG_FUNCTION_ARGS); +Datum ltree_addltree(PG_FUNCTION_ARGS); +Datum ltree_addtext(PG_FUNCTION_ARGS); +Datum ltree_textadd(PG_FUNCTION_ARGS); /* Util function */ -extern PGDLLEXPORT Datum ltree_in(PG_FUNCTION_ARGS); +Datum ltree_in(PG_FUNCTION_ARGS); bool ltree_execute(ITEM *curitem, void *checkval, bool calcnot, bool (*chkcond) (void *checkval, ITEM *val)); diff --git a/doc/src/sgml/xfunc.sgml b/doc/src/sgml/xfunc.sgml index 6060e61857..de6a466efc 100644 --- a/doc/src/sgml/xfunc.sgml +++ b/doc/src/sgml/xfunc.sgml @@ -2577,23 +2577,6 @@ concat_text(PG_FUNCTION_ARGS) error messages to this effect. - - - - To work correctly on Windows, C-language functions need - to be marked with PGDLLEXPORT, unless you use a build - process that marks all global functions that way. In simple cases - this detail will be handled transparently by - the PG_FUNCTION_INFO_V1 macro. However, if you write - explicit external declarations (perhaps in header files), be sure - to write them like this: - -extern PGDLLEXPORT Datum funcname(PG_FUNCTION_ARGS); - - or you'll get compiler complaints when building on Windows. (On - other platforms, the PGDLLEXPORT macro does nothing.) - - diff --git a/src/include/fmgr.h b/src/include/fmgr.h index 3668ac3f6e..0878418516 100644 --- a/src/include/fmgr.h +++ b/src/include/fmgr.h @@ -350,11 +350,12 @@ typedef const Pg_finfo_record *(*PGFInfoFunction) (void); * * On Windows, the function and info function must be exported. Our normal * build processes take care of that via .DEF files or --export-all-symbols. - * Module authors using a different build process might do it differently, - * so we declare these functions PGDLLEXPORT for their convenience. + * Module authors using a different build process might need to manually + * declare the function PGDLLEXPORT. We do that automatically here for the + * info function, since authors shouldn't need to be explicitly aware of it. */ #define PG_FUNCTION_INFO_V1(funcname) \ -extern PGDLLEXPORT Datum funcname(PG_FUNCTION_ARGS); \ +extern Datum funcname(PG_FUNCTION_ARGS); \ extern PGDLLEXPORT const Pg_finfo_record * CppConcat(pg_finfo_,funcname)(void); \ const Pg_finfo_record * \ CppConcat(pg_finfo_,funcname) (void) \