Mingw 文件 c++locale.h 问题 - 我可以更改代码吗?
Issue with Mingw file c++locale.h - Can I change the code?
我目前遇到构建错误。这个错误看起来像这样
C:/mingw64/x86_64-w64-mingw32/include/c++/x86_64-w64-mingw32/bits/c++locale.h: In function 'int std::__convert_from_v(int* const&, char*, int, const char*, ...)':
C:/mingw64/x86_64-w64-mingw32/include/c++/x86_64-w64-mingw32/bits/c++locale.h:74:48: error: expected primary-expression before ',' token
const int __ret = __builtin_vsnprintf(__out, __size, __fmt, __args);
经过调查,我注意到 C++Locale.h
中的代码看起来像这样
// Written by Benjamin Kosnik <bkoz@redhat.com>
#ifndef _GLIBCXX_CXX_LOCALE_H
#define _GLIBCXX_CXX_LOCALE_H 1
#pragma GCC system_header
#include <clocale>
#define _GLIBCXX_NUM_CATEGORIES 0
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
typedef int* __c_locale;
// Convert numeric value of type double and long double to string and
// return length of string. If vsnprintf is available use it, otherwise
// fall back to the unsafe vsprintf which, in general, can be dangerous
// and should be avoided.
inline int
__convert_from_v(const __c_locale&, char* __out,
const int __size __attribute__((__unused__)),
const char* __fmt, ...)
{
char* __old = std::setlocale(LC_NUMERIC, 0);
char* __sav = 0;
if (__builtin_strcmp(__old, "C"))
{
const size_t __len = __builtin_strlen(__old) + 1;
__sav = new char[__len];
__builtin_memcpy(__sav, __old, __len);
std::setlocale(LC_NUMERIC, "C");
}
__builtin_va_list __args;
__builtin_va_start(__args, __fmt);
#ifdef _GLIBCXX_USE_C99
const int __ret = __builtin_vsnprintf(__out, __size, __fmt, __args);
#else
const int __ret = __builtin_vsprintf(__out, __fmt, __args);
#endif
__builtin_va_end(__args);
if (__sav)
{
std::setlocale(LC_NUMERIC, __sav);
delete [] __sav;
}
return __ret;
}
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace
#endif
现在如果我更改行中的参数,这个错误就会消失
inline int
__convert_from_v(const __c_locale&, char* __out,
const int __size __attribute__((__unused__)),
const char* __fmt, ...)
从 __out
到 __aout
之类的其他内容,或者如果我删除了内联关键字。我知道我不应该更改默认的 imp。文件。此文件位于文件夹
C:\mingw64\x86_64-w64-mingw32\include\c++\x86_64-w64-mingw32\bits
关于如何在不更改 Mingw GCC 64 位实际文件的情况下解决此问题的任何建议?
您似乎有自己的头文件来定义 __out
。只需找到它的位置,然后使用不同的名称即可。注意双下划线开头的标识符在C++
中保留;这就是为什么 c++locale.h
中的参数名称以 __
开头的原因,因此它们不会与用户可能定义的任何内容发生冲突。因此,您不应该出于自己的目的使用 __out
(如果这确实是问题所在)。
话虽如此,如果您编辑 c++locale.h
将 __out
的所有实例更改为 __aout
。
不会有任何不好的事情发生。
已更新以添加: 我认为 Ross Ridge 和我已经在评论中破解了它。这是来自mingw头文件i686-w64-mingw32\include\driverspecs.h
:
/*
* FIXME: These annotations are not driver-only and does not belong here
*/
#define __in
#define __in_bcount(Size)
#define __in_ecount(Size)
#define __out
#define __out_bcount(Size)
#define __out_bcount_part(Size, Length)
#define __out_ecount(Size)
所以 __out
的定义使得这个头文件与 c++locale.h
不兼容——一个 mingw 错误。
我目前遇到构建错误。这个错误看起来像这样
C:/mingw64/x86_64-w64-mingw32/include/c++/x86_64-w64-mingw32/bits/c++locale.h: In function 'int std::__convert_from_v(int* const&, char*, int, const char*, ...)':
C:/mingw64/x86_64-w64-mingw32/include/c++/x86_64-w64-mingw32/bits/c++locale.h:74:48: error: expected primary-expression before ',' token
const int __ret = __builtin_vsnprintf(__out, __size, __fmt, __args);
经过调查,我注意到 C++Locale.h
中的代码看起来像这样
// Written by Benjamin Kosnik <bkoz@redhat.com>
#ifndef _GLIBCXX_CXX_LOCALE_H
#define _GLIBCXX_CXX_LOCALE_H 1
#pragma GCC system_header
#include <clocale>
#define _GLIBCXX_NUM_CATEGORIES 0
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
typedef int* __c_locale;
// Convert numeric value of type double and long double to string and
// return length of string. If vsnprintf is available use it, otherwise
// fall back to the unsafe vsprintf which, in general, can be dangerous
// and should be avoided.
inline int
__convert_from_v(const __c_locale&, char* __out,
const int __size __attribute__((__unused__)),
const char* __fmt, ...)
{
char* __old = std::setlocale(LC_NUMERIC, 0);
char* __sav = 0;
if (__builtin_strcmp(__old, "C"))
{
const size_t __len = __builtin_strlen(__old) + 1;
__sav = new char[__len];
__builtin_memcpy(__sav, __old, __len);
std::setlocale(LC_NUMERIC, "C");
}
__builtin_va_list __args;
__builtin_va_start(__args, __fmt);
#ifdef _GLIBCXX_USE_C99
const int __ret = __builtin_vsnprintf(__out, __size, __fmt, __args);
#else
const int __ret = __builtin_vsprintf(__out, __fmt, __args);
#endif
__builtin_va_end(__args);
if (__sav)
{
std::setlocale(LC_NUMERIC, __sav);
delete [] __sav;
}
return __ret;
}
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace
#endif
现在如果我更改行中的参数,这个错误就会消失
inline int
__convert_from_v(const __c_locale&, char* __out,
const int __size __attribute__((__unused__)),
const char* __fmt, ...)
从 __out
到 __aout
之类的其他内容,或者如果我删除了内联关键字。我知道我不应该更改默认的 imp。文件。此文件位于文件夹
C:\mingw64\x86_64-w64-mingw32\include\c++\x86_64-w64-mingw32\bits
关于如何在不更改 Mingw GCC 64 位实际文件的情况下解决此问题的任何建议?
您似乎有自己的头文件来定义 __out
。只需找到它的位置,然后使用不同的名称即可。注意双下划线开头的标识符在C++
中保留;这就是为什么 c++locale.h
中的参数名称以 __
开头的原因,因此它们不会与用户可能定义的任何内容发生冲突。因此,您不应该出于自己的目的使用 __out
(如果这确实是问题所在)。
话虽如此,如果您编辑 c++locale.h
将 __out
的所有实例更改为 __aout
。
已更新以添加: 我认为 Ross Ridge 和我已经在评论中破解了它。这是来自mingw头文件i686-w64-mingw32\include\driverspecs.h
:
/*
* FIXME: These annotations are not driver-only and does not belong here
*/
#define __in
#define __in_bcount(Size)
#define __in_ecount(Size)
#define __out
#define __out_bcount(Size)
#define __out_bcount_part(Size, Length)
#define __out_ecount(Size)
所以 __out
的定义使得这个头文件与 c++locale.h
不兼容——一个 mingw 错误。