2017-01-27 7 views
1

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; 
} 

答えて

1

、アレイは、おそらくchar[8]直接int64_tとして再解釈することが必要、暗黙アレイ・ツー・ポインタ変換を阻害右辺の一部です。

アブソリュート変数(lvalue)を導入すると、tmp.__の配列からポインタへの変換が可能になり、ポインタはint64_tにキャストされ、実際には偽の値を返します。言い換えれば、作業は/コードをコンパイルすると、次のと同等です:

return (int64_t) &tmp.__[0]; // ok ??? 

これは次のようにあなたがチェックできる唯一の仮説である:

int64_t getId() { 
    pthread_t tmp = apr_os_thread_current(); 
    int64_t result = (int64_t) tmp.__; 
    if (result == (int64_t) &tmp.__[0]) 
     std::cerr << "oops!" << std::endl; 
    return result; 
} 
+0

はい、あなたは右のとおりです。出力はおっと」です! 515113908 " –

+0

"戻り値*((int64_t *)&apr_os_thread_current().__ [0]); –

+0

なぜ、不透明な構造体をint64_tに変換したいのですか? z/OS pthread_tは、実際には2つのinterger、つまりシーケンス番号とスレッド制御ブロック(TCB -Task Control Block)へのポインタです。私が過去に行った唯一の理由は、ログにTCBを印刷することです。 –

関連する問題