Насколько я понимаю, C предполагает, что все параметры являются целыми и возвращает целые числа. Я хотел бы обойти этот объект, но я понятия не имею, как и AFAIK его же размер INT, но он ломается. Вот воспроизводимый код.
В testc.c. Примечание: это ДОЛЖНО быть в файле C.
int test_c1() {
return test_c3(test_c2());
}
In testcpp.cpp
#include <iostream>
using namespace std;
struct MyType{
int a, b;
};
template <class T>
struct WrappedPointer {
T* lhs;
public:
void LHS(T*v) { lhs=v; }
T* LHS() { return lhs; }
WrappedPointer(){}
WrappedPointer(T*value) : lhs(value){}
WrappedPointer(const WrappedPointer&v) : lhs(v.lhs){}
T* operator->() const { return lhs; }
T* operator*() const { return lhs; }
};
typedef WrappedPointer<MyType> ObjPtr;
static_assert(sizeof(ObjPtr) == sizeof(int), "");
static_assert(sizeof(ObjPtr) == sizeof(void*),"");
extern "C" {
ObjPtr test_c1();
ObjPtr test_c2() {
//ObjPtr s=0;
ObjPtr s;
s.LHS(0);
cout <<"c2 " << s.LHS() << endl;
return s;
}
ObjPtr test_c3(ObjPtr v) {
cout <<"c3 " << v.LHS() << endl;
return v;
}
};
int main() {
auto v = test_c1();
cout <<"main " << v.LHS() << endl;
}
флаги компиляции gcc
gcc -Wall -c testc.c
testc.c: In function 'test_c1':
testc.c:2:2: warning: implicit declaration of function 'test_c3' [-Wimplicit-function-declaration]
testc.c:2:2: warning: implicit declaration of function 'test_c2' [-Wimplicit-function-declaration]
g++ -std=c++0x -Wall -c testcpp.cpp
g++ testc.o testcpp.o
a.exe
Должен произойти сбой, и, как вы можете видеть, единственным предупреждением, которое я когда-либо получал, была неявная функция :(. Почему происходит сбой? Особенно, когда я утверждал, что ObjPtr
действительно того же размера, что и int. Как исправить это так, что я могу обойти ObjPtr? Я не могу изменить библиотеку C, так что testc.c отключен.
-edit- вместо сбоя в VS 2010 я получаю эту распечатку, которая показывает, что переданный объект неверен. Я не понимаю, откуда взялась буква «В». Это происходит в режиме отладки. Релиз сбой с нарушением прав доступа.
c2 00000000
c3 0046F8B0
main CCCCCCCC
B
Press any key to continue . . .
Если вам интересно, если вы закомментируете конструкторы (и больше ничего не меняете), это будет работать в gcc. Если вы измените класс на struct, чтобы ни один член не был закрытым, он будет работать в msvc2010. Это исправление бессмысленно, но, похоже, его POD учитывается, когда я делаю это, и волшебным образом код работает. Что странно, поскольку определение в C не изменилось (так как определения нет). И конструкторы не делают ничего другого.