z/OSでは、pthread_t
タイプは、メンバーchar __[8];
を含む構造体です。戻り値からint64_t
にキャストしようとしました。私は、次のエラーました:xlC++コンパイラがrvalueのキャストに不平を言うのはなぜですか?
CCN5216 (S) An expression of type "char [8]" cannot be converted to type "int64_t"
をしかし、私は一時的な変数tmp
を使用している場合、それは動作します。私はエラーなしでVisual Studio 2015(zos pthread_t
に似たカスタムmypthread
構造体を定義する)でこのコードをコンパイルできます。 xlC++にこのキャストに問題がある理由は分かりますか?キャスト規格は適合していますか?一時変数なし
#define _OPEN_THREADS
#include <iostream>
#include <stdint.h>
#include <pthread.h>
pthread_t apr_os_thread_current() {
return pthread_t();
}
int64_t getId() {
pthread_t tmp = apr_os_thread_current();
return (int64_t) tmp.__; // ok
//return (int64_t) apr_os_thread_current().__; // CCN5216
//return reinterpret_cast<int64_t>(apr_os_thread_current().__); // CCN5216
}
int main() {
std::cout << getId() << std::endl;
return 0;
}
はい、あなたは右のとおりです。出力はおっと」です! 515113908 " –
"戻り値*((int64_t *)&apr_os_thread_current().__ [0]); –
なぜ、不透明な構造体をint64_tに変換したいのですか? z/OS pthread_tは、実際には2つのinterger、つまりシーケンス番号とスレッド制御ブロック(TCB -Task Control Block)へのポインタです。私が過去に行った唯一の理由は、ログにTCBを印刷することです。 –