MYSQL标头与C ++中的STL <算法>冲突

MYSQL headers conflict with STL in C++

1
2
3
4
5
6
7
// File test.cpp
#include <my_global.h>
#include
int main()
{
    return 0;
}

编译为:g ++ -c -I / usr / local / mysql / include / mysql / test.cpp,其中/ usr / local / mysql是mysql安装目录。然后编译器报告以下错误:

In file included from /usr/include/c++/4.4/algorithm:61,
from test.cpp:3:
/usr/include/c++/4.4/bits/stl_algobase.h:232:56: error: macro"min" passed 3 arguments, but takes just 2
/usr/include/c++/4.4/bits/stl_algobase.h:253:56: error: macro"max" passed 3 arguments, but takes just 2
In file included from /usr/include/c++/4.4/bits/stl_algo.h:61,
from /usr/include/c++/4.4/algorithm:62,
from test.cpp:3:
/usr/include/c++/4.4/bits/algorithmfwd.h:353:41: error: macro"max" passed 3 arguments, but takes just 2
/usr/include/c++/4.4/bits/algorithmfwd.h:364:41: error: macro"min" passed 3 arguments, but takes just 2
In file included from /usr/include/c++/4.4/algorithm:61,
from test.cpp:3:
/usr/include/c++/4.4/bits/stl_algobase.h:186: error: expected unqualified-id before ‘const’
/usr/include/c++/4.4/bits/stl_algobase.h:186: error: expected ‘)’ before ‘const’
/usr/include/c++/4.4/bits/stl_algobase.h:186: error: expected ‘)’ before ‘const’
/usr/include/c++/4.4/bits/stl_algobase.h:186: error: expected initializer before ‘const’
/usr/include/c++/4.4/bits/stl_algobase.h:209: error: expected unqualified-id before ‘const’
/usr/include/c++/4.4/bits/stl_algobase.h:209: error: expected ‘)’ before ‘const’
/usr/include/c++/4.4/bits/stl_algobase.h:209: error: expected ‘)’ before ‘const’
/usr/include/c++/4.4/bits/stl_algobase.h:209: error: expected initializer before ‘const’
/usr/include/c++/4.4/bits/stl_algobase.h:232: error: ‘std::min’ declared as an ‘inline’ variable
/usr/include/c++/4.4/bits/stl_algobase.h:232: error: template declaration of ‘const _Tp& std::min’
/usr/include/c++/4.4/bits/stl_algobase.h:235: error: expected primary-expression before ‘if’
/usr/include/c++/4.4/bits/stl_algobase.h:235: error: expected ‘}’ before ‘if’
/usr/include/c++/4.4/bits/stl_algobase.h:237: error: expected unqualified-id before ‘return’
/usr/include/c++/4.4/bits/stl_algobase.h:253: error: ‘max’ declared as an ‘inline’ variable
/usr/include/c++/4.4/bits/stl_algobase.h:253: error: template declaration of ‘const _Tp& max’
/usr/include/c++/4.4/bits/stl_algobase.h:256: error: expected primary-expression before ‘if’
/usr/include/c++/4.4/bits/stl_algobase.h:256: error: expected ‘}’ before ‘if’
/usr/include/c++/4.4/bits/stl_algobase.h:258: error: expected unqualified-id before ‘return’
/usr/include/c++/4.4/bits/stl_algobase.h:259: error: expected declaration before ‘}’ token

我认为my_global.h和算法之间存在一些名称冲突,因此我将my_global.h包装在命名空间中:

1
2
3
4
5
6
7
8
9
// File test.cpp
namespace MYSQL_NAMESPACE {
    #include <my_global.h>
}
#include
int main()
{
    return 0;
}

但这无济于事,编译器仍然会报告相同的错误。 然后,我将包含顺序更改如下:

1
2
3
4
5
6
7
// File test.cpp
#include
#include <my_global.h>
int main()
{
    return 0;
}

现在一切顺利。

有人真的知道这是什么问题吗?

TKS!


看来mysql标头定义了一个宏min

1
2
3
4
#if !defined(max)
#define max(a, b)       ((a) > (b) ? (a) : (b))
#define min(a, b)       ((a) < (b) ? (a) : (b))
#endif

已将此错误报告为MySQL,错误28184。该错误被标记为已关闭,因此请尝试更新到最新版本。根据错误页面,应该在版本5.1.23,版本6.0.4和更高版本中对其进行修复。


显然,名称空间技巧不起作用,因为min / max是宏,并且预处理程序不会查看名称空间范围。

这可能会解决问题:

1
2
3
4
#include <my_global.h>
#undef min
#undef max
#include

整个事情看起来很可怕:)


看起来my_global.h定义了algorithm用作预处理器宏的某些名称,从而导致编译失败。按照有效的顺序,您将无法使用my_global.h修饰符,但您的代码至少会编译,除非您需要该功能。如前所述,由于预处理器宏没有命名空间,因此命名空间包装将无济于事。

因此,听起来my_global.h坏了,但是如果一切正常,则只需使用适用的包含顺序即可。无论如何,这是我首选的顺序-首先是标准库头,然后是外部库头,再是内部头。