I noticed a problem when using pgettext on debian testing. When
I compile the following small test program 

#define ENABLE_NLS 1
#include "lib/gettext.h"

int test(){
  if (pgettext ("This is", "a bug") == "I guess")
    return 1;
}

I get the following error:

fritz@debian:~/pspp/gnulib$ gcc -c test.c
In file included from test.c:2:
test.c: In function ‘test’:
lib/gettext.h:123:67: error: ‘LC_MESSAGES’ undeclared (first use in this 
function)
  123 |    pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, 
LC_MESSAGES)
      |                                                                   
^~~~~~~~~~~
test.c:5:7: note: in expansion of macro ‘pgettext’
    5 |   if (pgettext ("This is", "a bug") == "I guess")
      |       ^~~~~~~~
lib/gettext.h:123:67: note: each undeclared identifier is reported only once 
for each function it appears in
  123 |    pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, 
LC_MESSAGES)
      |                                                                   
^~~~~~~~~~~
test.c:5:7: note: in expansion of macro ‘pgettext’
    5 |   if (pgettext ("This is", "a bug") == "I guess")
      |       ^~~~~~~~

When I compile with

gcc -c -O2 test.c

then it works. I guess the reason is that gettext.h includes 
/usr/include/libintl.h which
has the following part which includes „locale.h“ only when we are compiling 
with optimization.

/* Optimized version of the function above.  */
#if defined __OPTIMIZE__ && !defined __cplusplus

/* We need NULL for `gettext'.  */
# define __need_NULL
# include <stddef.h>

/* We need LC_MESSAGES for `dgettext'.  */
# include <locale.h>
…

I think gettext should always include <locale.h> or should somehow make sure
that LC_MESSAGES are defined or not used.

Best regards

Friedrich





Reply via email to