C++ QT类型被外部库定义为int?
我正在将一个项目集成到另一个项目中,并且在QT中遇到一些构建问题。 我遇到的问题是,在一个声明为QMetaType::Bool的moc文件中生成了一行。 它说“在'int'之前应该有一个非限定的id”,然后是由这一个错误引起的两个括号错误。 根据我的研究,其他人说这是由于项目中其他地方的xlib.h将Bool定义为int。 我试过“undefbool”这句话,但似乎不管用。当我把它放在调用堆栈中最新的cpp文件的头中时,上面提到的错误消失了,但它也破坏了我在所述cpp文件中声明的所有对象,给了我一堆我知道不是真的未定义的引用错误。 所以有两个问题:C++ QT类型被外部库定义为int?,c++,qt,cmake,qmake,C++,Qt,Cmake,Qmake,我正在将一个项目集成到另一个项目中,并且在QT中遇到一些构建问题。 我遇到的问题是,在一个声明为QMetaType::Bool的moc文件中生成了一行。 它说“在'int'之前应该有一个非限定的id”,然后是由这一个错误引起的两个括号错误。 根据我的研究,其他人说这是由于项目中其他地方的xlib.h将Bool定义为int。 我试过“undefbool”这句话,但似乎不管用。当我把它放在调用堆栈中最新的cpp文件的头中时,上面提到的错误消失了,但它也破坏了我在所述cpp文件中声明的所有对象,给了我
#undef QT_MOC_LITERAL
static const uint qt_meta_data_FUNCTIONNAMEREDACTED[] = {
// content:
7, // revision
0, // classname
0, 0, // classinfo
6, 14, // methods
0, 0, // properties
0, 0, // enums/sets
0, 0, // constructors
0, // flags
0, // signalCount
// slots: name, argc, parameters, tag, flags
1, 0, 44, 2, 0x0a /* Public */,
3, 1, 45, 2, 0x0a /* Public */,
5, 1, 48, 2, 0x0a /* Public */,
6, 0, 51, 2, 0x0a /* Public */,
7, 1, 52, 2, 0x0a /* Public */,
9, 1, 55, 2, 0x0a /* Public */,
// slots: parameters
QMetaType::Void,
QMetaType::Void, QMetaType::Int, 4,
QMetaType::Void, QMetaType::Int, 4,
QMetaType::Void,
QMetaType::Void, QMetaType::Bool, 8,
QMetaType::Void, QMetaType::QString, 10,
0 // eod
};
C++中的继承是C.
粗略地说,它提供了超出(在)编译器精确语法分析之前的文本替换。()由于预处理器是代码>命名空间< /代码>不可知,C中没有问题(在这里,名称空间不存在),但它会在C++中产生奇怪的效果。 虽然我第一次听到有关
xlib.h
的问题,但这是有关windows.h
的常见奇怪问题的来源(这使得大量使用宏在ASCII和Unicode风格的API函数之间切换)
预处理的中间结果通常直接输入到以下编译器阶段,以便作者不会立即看到意外的替换
然而,每个C和C++编译器都提供了一个只预处理运行的选项,该程序只发出产生的C或C++源代码。因此,在像OP这样的奇怪和难以解释的错误的情况下,访问至少出现在错误源的C++源的预处理源文件可能是值得的。 (即使报告了头文件的错误,也必须将其追溯到源文件,因为
#include
也是预处理的主题。)
这些预处理文件可能会变得非常庞大,因为许多标准和/或系统标题可能也包含在(间接的)中,导致单个C++源文件的数千行。 另一个选项是启用有关所包含标题的诊断输出
对于MSVC++,分别是。选择是。默认情况下,此选项通常被禁用,因为即使列出include,也往往会导致冗长且不方便的诊断输出一旦宏(定义在直接或间接包含的标题中)被确定为故障源,人们就可以考虑如何解决这个问题 主要有两种选择:
#include
s的顺序#未定义
响应。在此源文件中,在相关的#include
之后或至少在最后一个#include
之后的宏这必须在所有相关的C++源文件中完成。< /P> 它也可以在标题中完成,但这很容易出错,我不建议这样做。原因很简单:
宏可能已定义、未定义或再次定义,而实际执行宏的方式取决于确切的顺序,编译器会“查看”文件。 对于C++源文件,这是很清楚的,因为它是一个独立的。 相反,在其他报头之前或之后,在头上写入的头中可能难以包含一个报头。< P> C++中的继承是C.</P>的继承。 粗略地说,它提供了超出(在)编译器精确语法分析之前的文本替换。()由于预处理器是代码>命名空间< /代码>不可知,C中没有问题(在这里,名称空间不存在),但它会在C++中产生奇怪的效果。 虽然我第一次听到有关
xlib.h
的问题,但这是有关windows.h
的常见奇怪问题的来源(这使得大量使用宏在ASCII和Unicode风格的API函数之间切换)
预处理的中间结果通常直接输入到以下编译器阶段,以便作者不会立即看到意外的替换
然而,每个C和C++编译器都提供了一个只预处理运行的选项,该程序只发出产生的C或C++源代码。因此,在像OP这样的奇怪和难以解释的错误的情况下,访问至少出现在错误源的C++源的预处理源文件可能是值得的。 (即使报告了头文件的错误,也必须将其追溯到源文件,因为
#include
也是预处理的主题。)
这些预处理文件可能会变得非常庞大,因为许多标准和/或系统标题可能也包含在(间接的)中,导致单个C++源文件的数千行。 另一个选项是启用有关所包含标题的诊断输出
对于MSVC++,分别是。选择是。默认情况下,此选项通常被禁用,因为即使列出include,也往往会导致冗长且不方便的诊断输出一旦宏(定义在直接或间接包含的标题中)被确定为故障源,人们就可以考虑如何解决这个问题 主要有两种选择:
#include
s的顺序#未定义
响应。在相关的#之后的宏包括
,或者至少在最后一个#i之后