Почему компилятор xlc ++ жалуется на приведение значения r?

В z / OS pthread_t тип — это структура, которая содержит член char __[8];, Я пытался привести это из возвращаемого значения к int64_t, Я получил следующую ошибку:

CCN5216 (S) Выражение типа «char [8]» не может быть преобразовано в тип «int64_t»

Но если я использую временную переменную tmp оно работает. Я могу скомпилировать этот код с Visual Studio 2015 (определяя пользовательский mypthread структура похожа на зос pthread_tбез ошибок. Вы знаете, почему у 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

Решение

Без временной переменной массив является частью значения r, которое, вероятно, запрещает неявное преобразование массива в указатель, требуя, чтобы 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;
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]