Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将C程序的语言环境设置为;";场所_C_Linux - Fatal编程技术网

如何将C程序的语言环境设置为;";场所

如何将C程序的语言环境设置为;";场所,c,linux,C,Linux,C程序启动时会继承其语言环境变量。这是自动发生的。但是,这些变量不会自动控制库函数使用的区域设置,因为ANSI C表示所有程序默认在标准“C”区域设置中启动 我有,所以C程序在启动时必须这样做: setlocale(LC_ALL, "C"); 但是这行代码是如何在C程序中结束的呢?编译器是否为我添加了它?这是特定于平台的。在GNU/Linux系统上,语言环境由glibc管理,glibc将设置存储在全局变量\u nl\u global\u locale中。要满足默认设置的要求,只需: 实际上不需

C程序启动时会继承其语言环境变量。这是自动发生的。但是,这些变量不会自动控制库函数使用的区域设置,因为ANSI C表示所有程序默认在标准
“C”
区域设置中启动

我有,所以C程序在启动时必须这样做:

setlocale(LC_ALL, "C");

但是这行代码是如何在C程序中结束的呢?编译器是否为我添加了它?

这是特定于平台的。在GNU/Linux系统上,语言环境由glibc管理,glibc将设置存储在全局变量
\u nl\u global\u locale
中。要满足默认设置的要求,只需:


实际上不需要调用
setlocale(LC_ALL,“C”)编译器不会修改源代码并向主程序添加对
setlocale()
的显式调用。相反,需要实现(编译器和库的组合)来确保程序的行为“就像”在开始时调用了
setlocale()

程序行为的许多其他方面的实现也必须确保正常工作。例如,它必须确保正确设置了
stdin
stdout
stderr
——您不必在
main()
程序中显式打开这些流,因为库确保在调用
main()
之前设置它们。在POSIX系统上,启动代码确保适当设置了
environ
全局变量。您可以在的POSIX规范中看到很多相关信息,包括:

对于新的过程映像,等效于:

setlocale(LC_ALL, "C")
应在启动时执行

C标准也说了同样的话:

在程序启动时,相当于

setlocale(LC_ALL, "C");
被执行


任何特定实现如何实现效果的细节本质上是特定于实现的,但通常是通过使用适当的正确值初始化选定的全局变量来实现的。标准没有说明实施必须如何达到效果;它只是说它必须实现它。

它发生在程序启动期间。编译器发出代码,或者在启动过程中调用了库中的代码。我将“default”理解为“在没有调用
setlocale
”这不取决于实现吗?库需要设置区域设置,就好像它包含该行一样,就像需要确保
stdin
一样,
stdout
stderr
已正确初始化,就好像通过适当调用
fopen()
一样。您可以通过添加
setlocale(LC_ALL,”)来设置实现定义的替代语言环境到程序的开始。C标准未规定任何其他值,属于“实现定义的行为”类别。
setlocale(LC_ALL, "C");