error C3010: ‘return’: OpenMP
以前,OpenMP を有効にしないで使用していたコード.
最近のコードで,OpenMP を有効にしたプロジェクトが増えてきた.
それでビルドしていると C3010 のエラーになってしまう.
関連する部分を,単体テスト用の cpp に張り付けてビルド.
11:21 でビルドが開始されました...
1>------ ビルド開始: プロジェクト: C_drv, 構成: Debug Win32 ------
1>C_drv.cpp
1>L:\Document\Develop\VC_Test\PC_doc\C_drv\C_drv.cpp(60,36): error C3010: 'return': OpenMP 構造化ブロックからのジャンプは許可されていません
1>L:\Document\Develop\VC_Test\PC_doc\C_drv\C_drv.cpp(64,45): error C3010: 'return': OpenMP 構造化ブロックからのジャンプは許可されていません
1>L:\Document\Develop\VC_Test\PC_doc\C_drv\C_drv.cpp(67,4): error C3010: 'return': OpenMP 構造化ブロックからのジャンプは許可されていません
1>L:\Document\Develop\VC_Test\PC_doc\C_drv\C_drv.cpp(69,3): error C3010: 'return': OpenMP 構造化ブロックからのジャンプは許可されていません
1>プロジェクト "C_drv.vcxproj" のビルドが終了しました -- 失敗。
========== ビルド: 成功 0、失敗 1、最新の状態 0、スキップ 0 ==========
=========== ビルド は 11:21 で完了し、06.452 秒 掛かりました ==========
OpenMP のコードの部分を一つの関数とすることで対応.
bool NET_is_valid (LPCTSTR path)
{
tstring net_root = ::Path_Get_net_root(path) ;
bool is_valid = false ;
#ifdef _OPENMP
#pragma omp critical (NET_is_valid)
#endif
{
is_valid = ::NET_is_valid_critical(net_root) ;
}
return is_valid ;
}
何故か,VC 2015 と 2017 ではエラーにならなかった.