鱼C论坛

 找回密码
 立即注册
查看: 1128|回复: 1

[已解决]C函数setlocale()返回NULL

[复制链接]
发表于 2018-8-25 14:49:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 dt3tc 于 2018-8-25 14:57 编辑

去头文件看只找到函数声明,找不到函数定义
gcc 6.4 .0
sabayon Linux
谢谢


#include <stdio.h>
#include <locale.h>
#include <wchar.h>

int main(){
        // 使用指定的 locale
         char* locname = setlocale(LC_ALL,"zh_CN.UTF-8");
         if ( NULL == locname ) {
                printf("setlocale() with %s failed.\n","zh_CN.UTF-8");
        }
        else
        {
                printf("setlocale() with %s succeed.\n","zh_CN.UTF-8");
        }
        return 0;
}


与该库函数直接关联的头文件
/* Copyright (C) 1991-2017 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <http://www.gnu.org/licenses/>.  */

/*
*        ISO C99 Standard: 7.11 Localization        <locale.h>
*/

#ifndef        _LOCALE_H
#define        _LOCALE_H        1

#include <features.h>

#define __need_NULL
#include <stddef.h>
#include <bits/locale.h>

__BEGIN_DECLS

/* These are the possibilities for the first argument to setlocale.
   The code assumes that the lowest LC_* symbol has the value zero.  */
#define LC_CTYPE          __LC_CTYPE
#define LC_NUMERIC        __LC_NUMERIC
#define LC_TIME           __LC_TIME
#define LC_COLLATE        __LC_COLLATE
#define LC_MONETARY       __LC_MONETARY
#define LC_MESSAGES       __LC_MESSAGES
#define        LC_ALL                  __LC_ALL
#define LC_PAPER          __LC_PAPER
#define LC_NAME                  __LC_NAME
#define LC_ADDRESS          __LC_ADDRESS
#define LC_TELEPHONE          __LC_TELEPHONE
#define LC_MEASUREMENT          __LC_MEASUREMENT
#define LC_IDENTIFICATION __LC_IDENTIFICATION


/* Structure giving information about numeric and monetary notation.  */
struct lconv
{
  /* Numeric (non-monetary) information.  */

  char *decimal_point;                /* Decimal point character.  */
  char *thousands_sep;                /* Thousands separator.  */
  /* Each element is the number of digits in each group;
     elements with higher indices are farther left.
     An element with value CHAR_MAX means that no further grouping is done.
     An element with value 0 means that the previous element is used
     for all groups farther left.  */
  char *grouping;

  /* Monetary information.  */

  /* First three chars are a currency symbol from ISO 4217.
     Fourth char is the separator.  Fifth char is '\0'.  */
  char *int_curr_symbol;
  char *currency_symbol;        /* Local currency symbol.  */
  char *mon_decimal_point;        /* Decimal point character.  */
  char *mon_thousands_sep;        /* Thousands separator.  */
  char *mon_grouping;                /* Like `grouping' element (above).  */
  char *positive_sign;                /* Sign for positive values.  */
  char *negative_sign;                /* Sign for negative values.  */
  char int_frac_digits;                /* Int'l fractional digits.  */
  char frac_digits;                /* Local fractional digits.  */
  /* 1 if currency_symbol precedes a positive value, 0 if succeeds.  */
  char p_cs_precedes;
  /* 1 iff a space separates currency_symbol from a positive value.  */
  char p_sep_by_space;
  /* 1 if currency_symbol precedes a negative value, 0 if succeeds.  */
  char n_cs_precedes;
  /* 1 iff a space separates currency_symbol from a negative value.  */
  char n_sep_by_space;
  /* Positive and negative sign positions:
     0 Parentheses surround the quantity and currency_symbol.
     1 The sign string precedes the quantity and currency_symbol.
     2 The sign string follows the quantity and currency_symbol.
     3 The sign string immediately precedes the currency_symbol.
     4 The sign string immediately follows the currency_symbol.  */
  char p_sign_posn;
  char n_sign_posn;
#ifdef __USE_ISOC99
  /* 1 if int_curr_symbol precedes a positive value, 0 if succeeds.  */
  char int_p_cs_precedes;
  /* 1 iff a space separates int_curr_symbol from a positive value.  */
  char int_p_sep_by_space;
  /* 1 if int_curr_symbol precedes a negative value, 0 if succeeds.  */
  char int_n_cs_precedes;
  /* 1 iff a space separates int_curr_symbol from a negative value.  */
  char int_n_sep_by_space;
  /* Positive and negative sign positions:
     0 Parentheses surround the quantity and int_curr_symbol.
     1 The sign string precedes the quantity and int_curr_symbol.
     2 The sign string follows the quantity and int_curr_symbol.
     3 The sign string immediately precedes the int_curr_symbol.
     4 The sign string immediately follows the int_curr_symbol.  */
  char int_p_sign_posn;
  char int_n_sign_posn;
#else
  char __int_p_cs_precedes;
  char __int_p_sep_by_space;
  char __int_n_cs_precedes;
  char __int_n_sep_by_space;
  char __int_p_sign_posn;
  char __int_n_sign_posn;
#endif
};


/* Set and/or return the current locale.  */
extern char *setlocale (int __category, const char *__locale) __THROW;

/* Return the numeric/monetary information for the current locale.  */
extern struct lconv *localeconv (void) __THROW;


#ifdef        __USE_XOPEN2K8
/* POSIX.1-2008 extends the locale interface with functions for
   explicit creation and manipulation of 'locale_t' objects
   representing locale contexts, and a set of parallel
   locale-sensitive text processing functions that take a locale_t
   argument.  This enables applications to work with data from
   multiple locales simultaneously and thread-safely.  */
# include <bits/types/locale_t.h>

/* Return a reference to a data structure representing a set of locale
   datasets.  Unlike for the CATEGORY parameter for `setlocale' the
   CATEGORY_MASK parameter here uses a single bit for each category,
   made by OR'ing together LC_*_MASK bits above.  */
extern locale_t newlocale (int __category_mask, const char *__locale,
                           locale_t __base) __THROW;

/* These are the bits that can be set in the CATEGORY_MASK argument to
   `newlocale'.  In the GNU implementation, LC_FOO_MASK has the value
   of (1 << LC_FOO), but this is not a part of the interface that
   callers can assume will be true.  */
# define LC_CTYPE_MASK                (1 << __LC_CTYPE)
# define LC_NUMERIC_MASK        (1 << __LC_NUMERIC)
# define LC_TIME_MASK                (1 << __LC_TIME)
# define LC_COLLATE_MASK        (1 << __LC_COLLATE)
# define LC_MONETARY_MASK        (1 << __LC_MONETARY)
# define LC_MESSAGES_MASK        (1 << __LC_MESSAGES)
# define LC_PAPER_MASK                (1 << __LC_PAPER)
# define LC_NAME_MASK                (1 << __LC_NAME)
# define LC_ADDRESS_MASK        (1 << __LC_ADDRESS)
# define LC_TELEPHONE_MASK        (1 << __LC_TELEPHONE)
# define LC_MEASUREMENT_MASK        (1 << __LC_MEASUREMENT)
# define LC_IDENTIFICATION_MASK        (1 << __LC_IDENTIFICATION)
# define LC_ALL_MASK                (LC_CTYPE_MASK \
                                 | LC_NUMERIC_MASK \
                                 | LC_TIME_MASK \
                                 | LC_COLLATE_MASK \
                                 | LC_MONETARY_MASK \
                                 | LC_MESSAGES_MASK \
                                 | LC_PAPER_MASK \
                                 | LC_NAME_MASK \
                                 | LC_ADDRESS_MASK \
                                 | LC_TELEPHONE_MASK \
                                 | LC_MEASUREMENT_MASK \
                                 | LC_IDENTIFICATION_MASK \
                                 )

/* Return a duplicate of the set of locale in DATASET.  All usage
   counters are increased if necessary.  */
extern locale_t duplocale (locale_t __dataset) __THROW;

/* Free the data associated with a locale dataset previously returned
   by a call to `setlocale_r'.  */
extern void freelocale (locale_t __dataset) __THROW;

/* Switch the current thread's locale to DATASET.
   If DATASET is null, instead just return the current setting.
   The special value LC_GLOBAL_LOCALE is the initial setting
   for all threads and can also be installed any time, meaning
   the thread uses the global settings controlled by `setlocale'.  */
extern locale_t uselocale (locale_t __dataset) __THROW;

/* This value can be passed to `uselocale' and may be returned by it.
   Passing this value to any other function has undefined behavior.  */
# define LC_GLOBAL_LOCALE        ((locale_t) -1L)

#endif

__END_DECLS

#endif /* locale.h  */
最佳答案
2018-9-11 08:36:26
有些函数封装起来了,看不到的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-9-11 08:36:26 | 显示全部楼层    本楼为最佳答案   
有些函数封装起来了,看不到的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-30 09:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表