[QT编程系列-20]:基本框架 - QT的测试框架QTest

2023-11-04

目录

第1章 QT测试框架与搭建步骤

第2章 Qt Test概述

2.1 概述

2.2 测试代码和项目代码共存

2.3 如何运行测试代码

2.4 ctest命令

第3章 单元测试代码示例

3.1 代码目录结构

3.2 代码示例

第4章 QTest预定义断言宏

4.1 概述

4.2 QTEST_MAIN

第5章 测试报告

5.1 概述

5.2 测试报告示例


第1章 QT测试框架与搭建步骤

在使用Qt框架进行测试时,你可以使用Qt提供的测试框架Qt Test来编写和执行测试。

下面是一个基本的步骤来进行测试:

  1. 创建测试项目:

    • 使用Qt Creator创建一个新的测试项目或将测试代码添加到现有的Qt项目中。
  2. 导入Qt Test库:

    • 在测试项目中,确保已经导入Qt Test库。在.pro文件中添加QT += testlib来导入Qt Test模块。
  3. 编写测试用例:

    • 创建一个单独的测试类或将测试函数添加到现有的类中。
    • 使用QObject派生的测试类,在类中添加测试函数。
    • 在测试函数中使用Qt Test提供的断言来验证预期结果。
  4. 运行测试:

    • 构建测试代码。
    • 在Qt Creator的“测试”菜单中,选择“运行单元测试”或使用命令行工具运行测试二进制文件。
  5. 分析测试结果:

    • 在测试运行过程中,会生成详细的测试结果报告。
    • 可以通过Qt Creator的“测试”面板查看结果或在命令行输出中查看结果。
  6. 修复问题:

    • 对于测试失败的用例,检查相关代码并修复错误。
    • 重新运行测试以确保修复成功。
  7. 重复迭代:

    • 持续运行测试并添加更多的测试用例。
    • 确保测试覆盖了你的代码的各个方面,并测试所有预期的行为和情况。

Qt Test提供了一系列的断言方法,如QVERIFYQCOMPARE等,可以用于验证条件和比较结果。此外,你还可以使用Qt的其他功能,如事件驱动、信号槽机制等,对界面进行测试。

通过使用Qt Test进行测试,你可以验证Qt应用程序的行为,确保代码的正确性和稳定性。这有助于减少潜在的错误,并增强你的代码在各种情况下的可靠性。

第2章 Qt Test概述

2.1 概述

Qt Test是Qt框架中的单元测试框架,它提供了一组用于编写和执行测试用例的工具和类。使用Qt Test可以方便地进行单元测试,并集成到你的Qt应用程序中。下面是一些关于Qt Test的重要概念和用法:

  1. 测试类和测试函数:

    • 测试类:使用QObject派生的类,用于封装一组相关的测试函数。可以使用宏Q_OBJECTQ_TESTLIB_MAIN来声明和定义测试类。
    • 测试函数:在测试类中定义的公共槽函数,用于执行实际的测试操作。测试函数应该以void返回类型,且没有输入参数。
  2. 断言和验证:

    • Qt Test提供了一系列的断言宏,用于验证条件和比较结果。一些常用的断言宏包括QVERIFYQCOMPAREQEXPECT_FAIL等。
    • 使用断言来验证预期结果,如果断言失败,将在测试报告中显示失败信息并标记为失败。
  3. 测试宏和标记:

    • Qt Test提供了一些测试宏和标记,用于控制测试的执行方式和流程。
    • 例如,QTEST_MAIN宏用于定义测试二进制文件的入口点,QSKIPQSKIP_ONCE标记用于跳过测试用例。
  4. 测试运行:

    • 使用qmake或CMake生成构建系统。
    • 构建测试二进制文件,并运行它。
    • 测试运行期间,将生成详细的测试结果报告,显示每个测试用例的状态和执行时间。
  5. 集成和扩展:

    • 可以将单元测试集成到你的Qt应用程序中。例如,你可以在Qt Creator中配置测试运行器,将测试和应用程序一起进行调试。
    • Qt Test提供了基于Qt的自定义测试框架,允许你创建自定义的测试类和测试函数,以满足特定的测试需求。

通过使用Qt Test,你可以编写和执行单元测试,验证代码的正确性和可靠性。使用Qt Test的断言和测试宏,你可以方便地编写详细的测试用例,并自动运行测试,并生成详细的测试报告。这样可以确保你的Qt应用程序具有高质量和稳定性。

2.2 测试代码和项目代码共存

在Qt中,测试代码和项目代码可以通过不同的目录结构和构建配置进行共存。

以下是一种常见的方式来共存测试代码和项目代码:

Project/
├── src/
│   ├── main.cpp
│   ├── ...
│   └── myClass.cpp
├── tests/
│   ├── main.cpp
│   ├── test_myClass.cpp
│   └── ...
├── app.pro
├── tests.pro
└── ...

  • Project/:项目根目录,包含源代码和测试代码。
  • src/:项目源代码目录,包含主要的应用程序源文件。
  • main.cpp:主应用程序的入口点。
  • myClass.cpp:项目的源代码文件。

  • tests/:测试代码目录,包含单元测试的相关文件。
  • main.cpp:测试代码的入口点,用于初始化测试环境。
  • test_myClass.cpp:包含对myClass.cpp中的代码进行单元测试的测试函数。
  • app.pro:项目的Qt工程文件,用于构建应用程序。
  • tests.pro:用于管理测试相关的Qt工程文件,用于构建测试程序。

在项目的Qt工程文件(.pro文件)中,可以添加以下内容来启用测试:

# app.pro

TEMPLATE = app
CONFIG += c++11

# ...

# 添加测试相关配置
include(tests/tests.pro)

在独立的tests.pro文件中,用于管理测试代码的构建配置:

# tests.pro

TEMPLATE = app
CONFIG += console
QT += testlib

DEPENDPATH += ../src
INCLUDEPATH += ../src

# 指定测试代码的存放目录
SOURCES += main.cpp \
           test_myClass.cpp

测试入口点main.cpp中的代码如下所示:

#include <QCoreApplication>
#include <QTest>

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    int result = 0;

    // 执行所有测试用例
    result |= QTest::qExec(new Test_myClass, argc, argv);

    return result;
}

test_myClass.cpp则包含了对myClass.cpp中的代码进行测试的具体实现。

通过这种方式,测试代码和项目代码被分为两个不同的目录,拥有各自的构建配置。这样,在构建应用程序时,只会包含项目代码;而在构建测试程序时,只会包含测试代码。这样可以确保测试代码与实际应用程序代码相互独立,并且不会影响项目的构建和部署过程。

2.3 如何运行测试代码

在Qt中运行测试代码需要使用Qt Test框架,并且有几种方式可以执行测试代码:

  1. 使用Qt Creator:

    • 创建一个新的测试项目或者在已有的项目中添加测试。
    • 在测试类中编写测试用例。
    • 使用Qt Creator的内置测试工具,右键单击测试类或者测试文件,然后选择"Run Tests"或者"Debug Tests"来运行测试。
  2. 使用命令行:

    • 在终端中导航到测试项目的构建目录(生成的可执行文件所在的目录)。
    • 运行可执行文件,例如 ./<executable_name>,这将执行所有的测试用例并输出结果。
  3. 使用CTest:

    • 在测试项目的构建目录中打开终端。
    • 运行 ctest 命令,该命令会自动查找并执行所有的测试用例,并生成测试报告。

请注意,为了能够运行测试代码,你的项目必须正确配置并链接Qt Test框架。确保在.pro文件中正确添加了QT += testlib配置,并在测试类中包含了适当的Qt Test头文件。

具体的步骤和命令可能会根据你的项目结构和配置而有所不同。建议查阅Qt Test框架的文档以获取更详细的指导和相关示例。

2.4 ctest命令

在Qt中,你可以使用CTest命令来运行测试。CTest是一个由CMake提供的测试框架,它可以与Qt Test框架一起使用。

以下是使用CTest命令运行测试的一般步骤:

  1. 确保你的Qt项目中已经使用CMake作为构建系统,并且配置了适当的测试。

  2. 在项目的构建目录中,打开终端或命令提示符。

  3. 运行ctest命令。

    • 如果是第一次运行,CTest会编译并执行所有的测试用例。
    • 如果之前已经运行过,CTest会根据上一次的执行情况以及任何更改来选择性地执行测试。
  4. CTest将显示测试执行的进度和结果。它会列出每个测试用例的名称、持续时间和结果。

    • 通过绿色“Passed”标记表示通过的测试用例。
    • 通过黄色“Not Run”标记表示没有运行的测试用例。
    • 通过红色“Failed”标记表示失败的测试用例。
  5. CTest还会生成HTML格式的测试报告。你可以在构建目录的Testing子目录中找到index.html文件,用浏览器打开该文件来查看报告。

注意:在使用CTest命令前,确保已经正确配置了测试用例,并通过CMake生成构建文件。

请参考Qt和CMake的文档以获取更详细的信息和特定于你的项目的指导。

第3章 单元测试代码示例

3.1 代码目录结构

Qt Test通常使用以下目录结构来组织测试代码:

Project/
├── src/
│   ├── main.cpp
│   └── ...
├── tests/
│   ├── main.cpp
│   ├── testClass1.cpp
│   ├── testClass1.h
│   ├── testClass2.cpp
│   ├── testClass2.h
│   └── ...
├── app.pro
└── ...

  • Project/:项目根目录,包含源代码和测试代码。
  • src/:包含主要的项目源代码文件。
  • main.cpp:主应用程序的入口点。
  • tests/:测试代码的目录。
  • main.cpp:测试代码的入口点,用于初始化测试环境。
  • testClass1.cpptestClass2.cpp:具体的测试类文件,包含了各自的测试函数,用于执行单元测试。
  • testClass1.htestClass2.h:测试类的头文件,声明了测试类和函数的接口。
  • app.pro:项目的Qt工程文件,用于构建应用程序和指定测试相关的配置。

在项目的Qt工程文件(.pro文件)中,可以添加以下内容来启用测试:

CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app

# ...

# 添加测试相关配置
QT += testlib

# 指定测试代码的存放目录
SOURCES += tests/main.cpp \
           tests/testClass1.cpp \
           tests/testClass2.cpp

HEADERS += tests/testClass1.h \
           tests/testClass2.h

在测试的main.cpp文件中,可以使用QTEST_MAIN宏来生成测试的主入口点:

#include <QTest>

int main(int argc, char **argv)
{
    // 初始化测试环境
    QApplication app(argc, argv);

    // 执行所有测试用例
    int result = QTest::qExec(new TestClass1, argc, argv);
    result |= QTest::qExec(new TestClass2, argc, argv);

    return result;
}

在每个测试类的实现文件中,你可以定义测试函数并使用Qt Test框架提供的断言和宏来编写测试逻辑。

通过这样的目录结构,你可以方便地组织和管理测试代码,并从主应用程序的源代码中单独分离出来。这样,你可以专注于测试逻辑,对应用程序进行全面的单元测试,并保持项目的整洁

3.2 代码示例

当编写Qt单元测试代码时,你可以使用Qt Test框架提供的宏和类来编写和执行测试用例。

下面是一个简单的示例,展示了如何编写一个Qt单元测试用例的代码:

// Example.h
#ifndef EXAMPLE_H
#define EXAMPLE_H

#include <QObject>

class Example : public QObject
{
    Q_OBJECT

public:
    Example(QObject* parent = nullptr);

    int add(int a, int b);
};

#endif // EXAMPLE_H


// Example.cpp
#include "Example.h"

Example::Example(QObject* parent) : QObject(parent)
{
}

int Example::add(int a, int b)
{
    return a + b;
}


// ExampleTest.cpp
#include <QtTest/QtTest>
#include "Example.h"

class ExampleTest : public QObject
{
    Q_OBJECT

private slots:
    void testAddition()
    {
        Example example;
        int result = example.add(2, 3);
        QCOMPARE(result, 5);
    }
};

QTEST_MAIN(ExampleTest)
#include "ExampleTest.moc"

在上述示例中,我们有一个简单的Example类,它包含一个add函数用于将两个整数相加。然后,我们创建了一个ExampleTest类,它是一个测试类,使用QObject派生并通过宏Q_OBJECT声明。在ExampleTest类中,我们定义了一个名为testAddition的测试函数,用于测试add函数的结果是否符合预期。

在测试函数中,使用Example类的实例化对象,然后使用QCOMPARE宏来比较实际结果和预期结果是否相等。如果结果不相等,测试将被标记为失败,并在测试报告中显示失败信息。

测试运行器(即测试二进制文件)由QTEST_MAIN宏定义,它充当测试程序的入口点。

请确保在.pro文件中添加QT += testlib以导入Qt Test模块,并将源文件添加到项目中进行构建。

通过运行测试二进制文件,你将看到运行结果并生成相应的测试报告。

这只是一个简单的示例,你可以根据你的项目和测试需求,编写更多的测试用例和测试类来覆盖代码的不同方面和情况。

第4章 QTest预定义断言宏

4.1 概述

Qt Test框架提供了一些有用的预定义宏,用于编写测试用例时进行断言和测试流程的控制。

以下是一些常用的Qt Test预定义宏:

  1. QCOMPARE(actual, expected)

    • 这个宏用于比较两个值是否相等。如果值不相等,测试将被标记为失败,并在测试报告中显示失败信息。
  2. QVERIFY(condition)

    • 这个宏用于验证条件是否为真。如果条件为假,测试将被标记为失败,并在测试报告中显示失败信息。
  3. QEXPECT_FAIL(testFunction, bugNumber)

    • 这个宏用于标记一个测试函数的预期失败。你可以在testFunction参数中指定测试函数的名称,并在bugNumber参数中提供一个描述性的字符串或Bug编号。
    • 使用此宏可以当遇到预期失败时,测试结果不会被标记为失败。相反,它会被标记为预期失败,并在测试报告中显示一个提示。
  4. QSKIP(reason)QSKIP_ONCE(reason)

    • 这些宏用于跳过一个测试用例或测试函数。你可以通过提供一个原因或描述性的字符串来说明为什么跳过该测试。
    • QSKIP宏会使得测试被标记为已跳过,不会运行。QSKIP_ONCE宏只会跳过当前正在运行的测试函数,但仍然会运行其他测试函数。

这些预定义宏是Qt Test框架提供的一些基本工具,用于编写测试用例并执行断言。通过使用这些宏,你可以在测试中验证预期结果,并标记预期失败或跳过一些测试。

你可以根据测试需求和场景,使用这些预定义宏的组合来编写详细的测试用例,以确保代码的正确性和稳定性。

4.2 QTEST_MAIN

QTEST_MAIN是Qt Test框架提供的一个宏,它用于定义测试程序的入口点
当你使用Qt Test框架进行单元测试时,你需要在测试代码中包含以下代码:

QTEST_MAIN(YourTestClassName)

其中,YourTestClassName是你编写的测试类的名称。通过调用QTEST_MAIN宏,它会生成一个main函数,并将测试类的名称作为参数传递给QCoreApplication,以便初始化测试环境并执行测试。

QTEST_MAIN宏的作用相当于手动编写以下代码:

#include <QTest>

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);
    YourTestClassName test;
    return QTest::qExec(&test, argc, argv);
}

通过使用QTEST_MAIN宏,你无需手动编写上述的main函数,可以简化测试程序的创建和运行过程。

记住,在编写测试代码时应该在测试类的名称上使用Q_OBJECT宏,并在包含QTEST_MAIN之前包含"MOC"文件来处理信号和槽机制。

第5章 测试报告

5.1 概述

Qt Test框架提供了一个内置的测试报告生成机制,用于生成详细的测试结果报告。测试报告以文本形式在终端输出,可以添加到调试器日志中,或者以XML格式保存到文件中。以下是测试报告的一些相关信息:

  1. 报告类型:

    • 测试报告可以以文本形式输出到终端,以便在控制台中查看测试结果。
    • 你可以通过将CONFIG += console添加到.pro文件中,启用测试报告在终端的输出。
  2. 信息内容:

    • 测试报告会提供每个测试用例的详细结果信息,包括测试函数的名称、测试结果(通过、失败或跳过)、测试耗时等。
    • 如果断言失败,测试报告还会显示失败信息,以及相关的源代码位置,方便你进行调试和修复。
  3. XML报告:

    • 测试报告还可以以XML格式保存到文件中,以便进行更加灵活的处理和分析。
    • 可以通过设置QT_XMLTEST_OUTPUT_FILE环境变量来指定保存XML报告的文件名。
    • 使用QTEST_SET_MAIN_SOURCE_PATH宏,可以在XML报告中包含源代码文件的路径信息。
  4. 测试结果总结:

    • 在所有测试用例执行完成后,测试报告将显示一个汇总信息,包括测试总用例数、通过的用例数、失败的用例数、跳过的用例数和总耗时等。
    • 这个总结信息可以帮助你了解整体的测试结果情况。

通过测试报告,你可以迅速了解每个测试用例的结果和失败原因,并对代码中的问题进行定位和修复。此外,XML报告的生成还可以用于自动化测试和持续集成系统的集成。

5.2 测试报告示例

以下是一个简单的Qt Test框架生成的测试报告示例:

********* Start testing of MyTestClass *********
Config: Using Qt Test Library version 5.15.2, Qt 5.15.2 (x86_64-little_endian-lp64 shared (dynamic) release build; by GCC 7.5.0)
QWARN : MyTestClass::testAddition() QSKIP : Skipped testAddition()
QWARN : MyTestClass::testSubtraction() Skipped testSubtraction()
PASS   : MyTestClass::testMultiplication()
FAIL!  : MyTestClass::testDivision() Compared values are not the same
   Actual (result): 2
   Expected (expectedResult): 5
   Loc: [/path/to/mytestclass.cpp(25)]
PASS   : MyTestClass::testModulo()
PASS   : MyTestClass::testPower()
PASS   : MyTestClass::testSquareRoot()
FAIL!  : MyTestClass::testFactorial() QVERIFY2: Condition check failed: factorial(6) == 120
   Loc: [/path/to/mytestclass.cpp(45)]
PASS   : MyTestClass::cleanupTestCase()
Totals: 5 passed, 2 failed, 2 skipped, 9 tests
********* Finished testing of MyTestClass *********

在上述示例中,我们有一个名为MyTestClass的测试类,它包含了多个测试函数。以下是一些关键点:

  • testAddition()testSubtraction()测试函数都被跳过,因为它们使用了QSKIP宏进行标记。测试报告中显示了警告信息,并指示这些用例被跳过。

  • testDivision()使用QCOMPARE宏进行断言比较时失败。测试报告中显示了失败的信息,包括实际值和期望值。还提供了在源代码中定位错误的位置信息。

  • testFactorial()使用QVERIFY2宏进行了条件验证,并失败了。测试报告中显示了失败的信息和位置。

  • 使用PASS标记的测试函数表示测试通过,而使用FAIL标记的测试函数表示测试失败。

  • cleanupTestCase()表示在所有测试用例执行完成后执行的清理操作。

  • 在最后的总结中,我们看到了测试的总体情况:5个用例通过,2个用例失败,2个用例被跳过,共9个测试用例。

这个示例演示了测试报告中的一些关键信息,包括失败原因、位置信息、跳过的用例和总结统计。通过查看测试报告,你可以更好地理解测试结果并进行错误的排查和修复。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[QT编程系列-20]:基本框架 - QT的测试框架QTest 的相关文章

  • 如何在 C++ 中的文件末尾添加数据?

    我已按照网上的说明进行操作 此代码应该将输入添加到文件 数据库 的末尾 但当我检查时 数据会覆盖现有数据 请帮忙 这是我的代码 int main string name string address string handphone cou
  • 如何使用MemoryCache代替Timer来触发一个方法?

    以下方法通过等待已运行操作的结果来处理并发请求 对数据的请求可能会使用相同 不同的凭据同时出现 对于每组唯一的凭据 最多可以有一个GetCurrentInternal呼叫正在进行中 当准备就绪时 该呼叫的结果将返回给所有排队的服务员 pri
  • 使用Physics.Raycast 和Physics2D.Raycast 检测对象上的点击

    我的场景中有一个空的游戏对象 带有 2D 组件盒碰撞器 我将脚本附加到该游戏对象 void OnMouseDown Debug Log clic 但是当我点击我的游戏对象时 没有任何效果 你有什么想法 如何检测我的盒子碰撞器上的点击 使用光
  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • 如何在 C# 中从 UNIX 纪元时间转换并考虑夏令时?

    我有一个从 unix 纪元时间转换为 NET DateTime 值的函数 public static DateTime FromUnixEpochTime double unixTime DateTime d new DateTime 19
  • 如何修复此错误“GDI+ 中发生一般错误”?

    从默认名称打开图像并以默认名称保存 覆盖它 我需要从 Image Default jpg 制作图形 将其放在 picturebox1 image 上并在 picurebox1 上绘制一些图形 它有效 这不是我的问题 但我无法保存 pictu
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • 如何从 .resx 文件条目获取注释

    资源文件中的字符串有名称 值和注释 The ResXResourceReader类让我可以访问名称和值 有办法看评论吗 你应该能够得到Comment via ResXDataNode class http msdn microsoft co
  • 如何访问另一个窗体上的ListView控件

    当单击与 ListView 所在表单不同的表单中的按钮时 我试图填充 ListView 我在 Form1 中创建了一个方法以在 Form2 中使用 并将参数传递给 Form1 中的方法 然后填充 ListView 当我调试时 我得到了传递的
  • 将 System.Windows.Input.KeyEventArgs 键转换为 char

    我需要将事件参数作为char 但是当我尝试转换 Key 枚举时 我得到的字母和符号与传入的字母和符号完全不同 如何正确地将密钥转换为字符 这是我尝试过的 ObserveKeyStroke this new ObervableKeyStrok
  • 如何在 C# 中定义文本框数组?

    您好 当我在 Windows 申请表上创建文本框时 我无法将其命名为 box 0 box 1 等 我这样做的目的是因为我想循环使用它们 其实我发现TextBox array firstTextBox secondTextBox 也有效
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • 单击 form2 上的按钮触发 form 1 中的方法

    我对 Windows 窗体很陌生 我想知道是否可以通过单击表单 2 中的按钮来触发表单 1 中的方法 我的表格 1 有一个组合框 我的 Form 2 有一个 保存 按钮 我想要实现的是 当用户单击表单 2 中的 保存 时 我需要检查表单 1
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • 如何将自定义 JSON 文件添加到 IConfiguration 中?

    我正在使用 asp net Autofac 我正在尝试加载自定义 JSON 配置文件 并基于该文件创建 实例化 IConfiguration 实例 或者至少将我的文件包含到默认情况下构建的 IConfiguration asp net 中
  • 使用 Moq 使用内部构造函数模拟类型

    我正在尝试模拟 Microsoft Sync Framework 中的一个类 它只有一个内部构造函数 当我尝试以下操作时 var fullEnumerationContextMock new Mock
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • .NET中的LinkedList是循环链表吗?

    我需要一个循环链表 所以我想知道是否LinkedList是循环链表吗 每当您想要移动列表中的 下一个 块时 以循环方式使用它的快速解决方案 current current Next current List First 电流在哪里Linke
  • gcc 的配置选项如何确定默认枚举大小(短或非短)?

    我尝试了一些 gcc 编译器来查看默认枚举大小是否很短 至少一个字节 强制使用 fshort enums 或无短 至少 4 个字节 强制使用 fno short enums user host echo Static assert 4 si
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良

随机推荐