静的アサーション static_assert

記事リンク: https://subingwen.cn/cpp/static_assert/

1. 断言

断言(assertion)プログラミングではよくある手法です。通常の状況では、断言就是将一个返回值总是需要为真的判断表达式放在语句中,用于排除在设计的逻辑上不应该产生的情况

たとえば、関数は常に特定の範囲内のパラメータを入力する必要があります。その後、プログラマはパラメータのアサーションを使用して、パラメータで例外が発生したときにプログラムを強制的に終了することで、プログラムが論理的エラーに陥るのを避けることができます。混沌。

ある意味、通常のプログラムにはアサーションは必要ありませんが、プログラムのデバッグの場合、アサーションは通常、プログラム開発者が特定の前提条件に違反するプログラム エラーを迅速に見つけるのに役立ちます。

C++ プログラムでアサーションを使用したい場合は、プログラムにヘッダー ファイルを組み込む<cassert><assert.h>、ヘッダー ファイルによって実行時にアサーション用のアサート マクロが提供される必要があります。例えば:

#include <iostream>
#include <cassert>
using namespace std;

// 创建一个指定大小的 char 类型数组
char* createArray(int size)
{
    
    
    // 通过断言判断数组大小是否大于0
    assert(size > 0);	// 必须大于0, 否则程序中断
    char* array = new char[size];
    return array;
}

int main()
{
    
    
    char* buf = createArray(0);
    // 此处使用的是vs提供的安全函数, 也可以使用 strcpy
    strcpy_s(buf, 16, "hello, world!");
    cout << "buf = " << buf << endl;
    delete[]buf;
    return 0;
}

プログラムの 9 行目では、アサーションが使用されていますassert(expression)。これはパラメータが式であるマクロで、通常はブール値を返し、要求されます。そうでない場合は、表达式必须为 true 程序才能继续向下执行直接中断されます。

  • createArray パラメータが 0 より大きい場合、プログラムは通常どおり 16 行目から最後まで実行されます。
  • createArray パラメータが 0 以下の場合、プログラムは 16 行目まで実行されて直接終了し、以下に示すようなプロンプト情報が表示されます。

ここに画像の説明を挿入

2. 静的アサーション

上の例では、assert アサーションを使用しました。しかしassert是一个运行时断言、それだけです只有在程序运行时才能起作用 これは、プログラムを実行しない限り、特定の条件が真であるかどうかを知る方法がないことを意味します。例: 現在のプラットフォームが 32 ビットか 64 ビットかを知りたいです。この要件では、プログラムを実行する前に結果を取得する必要があります。アサーションを使用することは明らかに不可能です。この場合、次を使用する必要があります。 C++ 11静态断言が提供されました。

静的アサーション static_assert (いわゆる ) は、静态就是在编译时就能够进行检查的断言使用時にヘッダー ファイルを参照する必要がありません。静的アサーションのもう 1 つの利点は次のとおりです可以自定义违反断言时的错误提示信息静的アサーションは非常に簡単に使用でき、次の 2 つのパラメータを受け入れます。

  • 参数1:断言表达式,这个表达式通常需要返回一个 bool值
  • 参数2:警告信息,它通常就是一段字符串,在违反断言(表达式为false)时提示该信息

VS に基づいて計算されたバイト サイズと理論値との間に不一致があるため、次のプログラムは 64 ビット Linux に基づいてテストされ、静的アサーションを使用して現在のオペレーティング システムが 32 ビットであるかどうかを確認します。

// assert.cpp
#include <iostream>                                         
using namespace std;
  
int main()
{
    
    
    // 字体原因看起来是一个=, 其实这是两个=
    static_assert(sizeof(long) == 4, "错误, 不是32位平台...");
    cout << "64bit Linux 指针大小: " << sizeof(char*) << endl;
    cout << "64bit Linux long 大小: " << sizeof(long) <<endl;
  
    return 0;
}

g++ を使用してプログラムをコンパイルします。

$ g++ assert.cpp -std=c++11
assert.cpp: In function ‘int main()’:
assert.cpp:6:5: error: static assertion failed: 错误, 不是32位平台...
static_assert(sizeof(long) == 4, "错误, 不是32位平台...");

使用されている Linux は 64 ビットであるため、コンパイル フェーズ中に静的アサーション検出条件が失敗し、表示されるエラー メッセージは、静的アサーションに指定した 2 番目のパラメーターに対応する文字列です。

静的アサーションの条件判断を変更すると、次のようになります。

static_assert(sizeof(long) == 8, "错误, 不是64位平台...");

次にコンパイルします。

$ g++ assert.cpp -std=c++11

コンパイルが完了すると、実行可能プログラムが取得されa.out、プログラムを実行すると次の出力が表示されます。

$ ./a.out 
64bit Linux 指针大小: 8
64bit Linux long 大小: 8

静的アサーション条件が true と判断された場合、プログラムは下方向に実行を続行できます。

注:
による静态断言的表达式是在编译阶段进行检测,所以在它的表达式中不能出现变量,也就是说这个表达式必须是常量表达式

おすすめ

転載: blog.csdn.net/weixin_38346042/article/details/131509863