-edit- Я сузил его. Воспроизводимый: почему передача этого объекта в C прерывается мой код?
Мое приложение не работает должным образом после того, как я внес изменения. Я получил предупреждение в msvc, но не в gcc. Вот репо предупреждения.
предупреждение C4190: «fnA» имеет указанную C-связь, но возвращает UDT «Test», который несовместим с C
#include <type_traits>
template<class T>
class Test{
T t;
};
typedef Test<int> A;
//static_assert(std::is_pod<A>::value, "Not a POD"); //fails in msvc 2010
static_assert(sizeof(A) == sizeof(int), "");
static_assert(sizeof(A) == sizeof(void*), "");
extern "C" {
A fnA(A v) { return v; }
}
int main() {
A a;
fnA(a);
}
Насколько я знаю, не должно быть причин, по которым я не могу использовать Test в качестве возвращаемого значения; Это может быть не проблема, но это может быть проблемой. Я не могу понять проблему, но у меня возникают странности во время выполнения, которые я не могу воспроизвести (как gcc, так и msvc). Я подозревал, что проблема в том, что MyString повреждена, но, похоже, это не тот случай, который меня сильно смутил. Вот моя обертка. MyString составляет> 8 байт, и мне нужно передать это коду C, который, к сожалению, возвращает все через int. Вот почему я поставил статическое утверждение, чтобы увидеть, соответствует ли размер класса тому, что я ожидал. Теперь, когда размер/склейка обработаны, я все еще полностью как WTF!?! Почему это предупреждение существует и есть ли что-нибудь, что я могу сделать, чтобы исправить это?
Даже запись class Test{ T t; };
вызывает предупреждение, однако struct исправляет его. структура с приватными разрывами, и мне не нужно быть приватными.
ХОРОШО! После того, как я удалил конструкторы в WrappedPointer и изменил класс на struct (что делает lhs общедоступным). Он отлично работает в GCC и MSVC. Изменение struct WrappedPointer
на class WrappedPointer
ломает мой код. ВТФ!?! Это тоже отладочная сборка, не оптимизированная. С какой стати изменение ключевого слова struct на class нарушает код!?! ВТФ!?! НО это изменение не нарушает gcc. Использование конструкторов не по умолчанию ломает gcc...
template <class T>
struct WrappedPointer {
//private:
T* lhs;
public:
void SetLHS(T*v) { lhs=v; }
//WrappedPointer(){}
//WrappedPointer(T*value) : lhs(value){}
//WrappedPointer(const WrappedPointer&v) : lhs(v.lhs){}
T* operator->() const { return lhs; }
T* operator*() const { return lhs; }
template<class TT>
bool operator==(TT t) const { return *lhs==t; }
template<class TT>
bool operator!=(TT t) const { return *lhs!=t; }
bool operator==(int v) const { myassert2(v==0); return lhs==0; }
bool operator!=(int v) const { myassert2(v==0); return lhs!=0; }
bool operator==(const WrappedPointer&t) const { return *lhs==*t; }
bool operator!=(const WrappedPointer&t) const { return *lhs!=*t; }
}
typedef WrappedPointer<MyString> String;
//typedef MyString* String;
static_assert(sizeof(String) == sizeof(int), "");
static_assert(sizeof(String) == sizeof(void*),"");
fnA
, с полученным объектом? Поскольку в C нет классов, вы должны написать функцию, которая не возвращает класс, и использовать ее внутри кода C. - person jogojapan   schedule 09.03.2012external "C"
, но если типы C++, которые вы там используете, в конечном итоге возвращаются в код C, что код C должен с ними делать? Он не может иметь дело с классом. - person jogojapan   schedule 09.03.2012