Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.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++ QT类型被外部库定义为int?_C++_Qt_Cmake_Qmake - Fatal编程技术网

C++ QT类型被外部库定义为int?

C++ QT类型被外部库定义为int?,c++,qt,cmake,qmake,C++,Qt,Cmake,Qmake,我正在将一个项目集成到另一个项目中,并且在QT中遇到一些构建问题。 我遇到的问题是,在一个声明为QMetaType::Bool的moc文件中生成了一行。 它说“在'int'之前应该有一个非限定的id”,然后是由这一个错误引起的两个括号错误。 根据我的研究,其他人说这是由于项目中其他地方的xlib.h将Bool定义为int。 我试过“undefbool”这句话,但似乎不管用。当我把它放在调用堆栈中最新的cpp文件的头中时,上面提到的错误消失了,但它也破坏了我在所述cpp文件中声明的所有对象,给了我

我正在将一个项目集成到另一个项目中,并且在QT中遇到一些构建问题。 我遇到的问题是,在一个声明为QMetaType::Bool的moc文件中生成了一行。 它说“在'int'之前应该有一个非限定的id”,然后是由这一个错误引起的两个括号错误。 根据我的研究,其他人说这是由于项目中其他地方的xlib.h将Bool定义为int。 我试过“undefbool”这句话,但似乎不管用。当我把它放在调用堆栈中最新的cpp文件的头中时,上面提到的错误消失了,但它也破坏了我在所述cpp文件中声明的所有对象,给了我一堆我知道不是真的未定义的引用错误。 所以有两个问题:

  • 尽管我显式地调用了QMetaType::namespace,但为什么我从不同的库中获取不同的Bool定义时会出现错误

  • 有没有其他解决这个问题的方法

  • 编辑:这是导致moc文件中出现问题的功能块

    #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之后