<QtAssert>
開発およびデバッグ時の条件チェック用マクロ。詳細...
| Header: | #include <QtAssert> |
関数
| T * | q_check_ptr(T *p) |
マクロ
| void | Q_ASSERT(bool test) |
| void | Q_ASSERT_X(bool test, const char *where, const char *what) |
| void | Q_CHECK_PTR(void *pointer) |
(since 6.11) void | Q_PRESUME(bool expr) |
| void | Q_UNREACHABLE() |
(since 6.5) void | Q_UNREACHABLE_RETURN(...) |
関数のドキュメント
template <typename T> T *q_check_ptr(T *p)
p 上でQ_CHECK_PTR を実行し、p を返します。
これは、Q_CHECK_PTR のインライン版として使用できます。
マクロのドキュメント
void Q_ASSERT(bool test)
test がfalse の場合、ソースコードのファイル名と行番号を含む警告メッセージを出力します。
Q_ASSERT() は、開発中の前条件および後条件のテストに役立ちます。コンパイル時に `QT_NO_DEBUG ` が定義されていた場合、何もしません。
例:
// File: div.cpp
#include <QtGlobal>
int divide(int a, int b)
{
Q_ASSERT(b != 0);
return a / b;
}b がゼロの場合、Q_ASSERT文はqFatal()関数を使用して以下のメッセージを出力します:
ASSERT: "b != 0" in file div.cpp, line 7Q_ASSERT_X()、qFatal()、および「デバッグ手法」も参照してください 。
void Q_ASSERT_X(bool test, const char *where, const char *what)
test がfalse の場合、メッセージ「what 」に加え、where 、ソースファイル名、および行番号を出力します。
Q_ASSERT_X は、開発中の前条件および後条件のテストに役立ちます。コンパイル時に `QT_NO_DEBUG ` が定義されていた場合、何もしません。
例:
// File: div.cpp
#include <QtGlobal>
int divide(int a, int b)
{
Q_ASSERT_X(b != 0, "divide", "division by zero");
return a / b;
}b がゼロの場合、Q_ASSERT_X文はqFatal()関数を使用して以下のメッセージを出力します:
ASSERT failure in divide: "division by zero", file div.cpp, line 7関連項目: Q_ASSERT()、qFatal()、および「デバッグ手法」。
void Q_CHECK_PTR(void *pointer)
pointer がnullptr の場合、ソースコードのファイル名と行番号を含むメッセージを出力し、プログラムがメモリ不足になったことを通知して、プログラムの実行を中止します。例外処理が有効になっている場合は、代わりにstd::bad_alloc をスローします。
コンパイル時に `QT_NO_DEBUG ` および `QT_NO_EXCEPTIONS ` が定義されている場合、`Q_CHECK_PTR` は何も行いません。したがって、メモリの割り当てが成功したかどうかを `Q_CHECK_PTR` を使って確認してはなりません。なぜなら、場合によってはこのチェックが無効化されてしまうからです。
例:
int *a;
Q_CHECK_PTR(a = new int[80]); // WRONG!
a = new (std::nothrow) int[80]; // Right
Q_CHECK_PTR(a);qWarning() および「デバッグ手法」も参照してください 。
[since 6.11] void Q_PRESUME(bool expr)
コンパイラに対し、expr がtrue であるとみなさせる。
このマクロは、コンパイラがサポートしている場合、Q_ASSERT() および C++23 スタイルの[[assume]] 属性を生成します。サポートされていない場合は、Q_ASSERT() にフォールバックします。
このマクロは Qt 6.11 で導入されました。
Q_ASSERT()、Q_UNREACHABLE()、Q_LIKELY()、およびQ_ASSUME()も参照してください 。
void Q_UNREACHABLE()
コンパイラに対し、現在の位置にはいかなる実行経路からも到達できないことを通知します。これにより、コンパイラはここに至るすべてのコードパスをデッドコードとして最適化できるほか、ここから続くコードも最適化できるようになります。
このマクロは、実現不可能な条件をマークするのに役立ちます。例えば、次のような列挙型があるとします:
enum Shapes {
Rectangle,
Triangle,
Circle,
NumShapes
};次のような switch テーブルを記述できます:
switch (shape) {
case Rectangle:
return rectangle();
case Triangle:
return triangle();
case Circle:
return circle();
case NumShapes:
Q_UNREACHABLE();
break;
}その箇所に Q_UNREACHABLE() を挿入する利点は、その値を含む shape 変数に対するコードを生成しないようコンパイラに指示できることです。このマクロがない場合、コンパイラはその値に対する必要な比較処理を依然として生成してしまいます。 caseラベルが削除された場合、一部のコンパイラは、一部の列挙型値がチェックされていないという警告を出力することがあります。
不可能な条件でこのマクロを使用することで、デッドコードパスが排除され、コードカバレッジが向上する可能性があります。
デバッグビルドでは、デバッグを容易にするために、この条件がアサートによって強制されます。
注: マクロ `Q_UNREACHABLE_RETURN()`を使用すると 、それを必要とするコンパイラに対して `return` 文を挿入できる一方で、その存在を問題視するコンパイラでは警告が発生することはありません。
Q_ASSERT()、qFatal()、Q_UNREACHABLE_RETURN()、およびQ_PRESUME()も参照してください 。
[since 6.5] void Q_UNREACHABLE_RETURN(...)
これは、
Q_UNREACHABLE();
return __VA_ARGS__;ですが、これについて警告を出すコンパイラでは、return 文が省略されています。
このマクロは Qt 6.5 で導入されました。
Q_UNREACHABLE() およびQ_PRESUME()も参照してください 。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.