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标头定义了一个宏
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 |
整个事情看起来很可怕:)
看起来
因此,听起来