C++에서 구조체 초기화?
글쓴이: hwiorb / 작성시간: 금, 2011/05/06 - 8:30오후
extern "C" const struct sensors_module_t HAL_MODULE_INFO_SYM = {
common : {
tag : HARDWARE_MODULE_TAG,
version_major: 1,
version_minor: 0,
id: SENSORS_HARDWARE_MODULE_ID,
name: "------- sensor module",
author: "------------- ----",
methods: &s_module_methods,
},
get_sensors_list: s_get_sensors_list
};
안드로이드 쪽에서 작업중인데요.
현재 vendor에서 제공된 소스에서 다른 에러는 다 잡아냈는데...
vendor/ASDF/FGHK/sensors.cpp:100: sorry, unimplemented: non-trivial designated initializers not supported
위와 같이 나오는게 도무지 이해가 안됩니다. 찾아보니, 이러한 초기화 방식이 C99인것은 알겠는데,
extern "C"를 통해서 쓸 수 있는게 아닌가요?
Forums:
...
extern "C"는 단지 링커가 심볼을 생성할 때 C와 호환되는 이름으로 생성하는 역할을 할 뿐입니다. extern "C"를 사용해도 문법은 C++의 문법에 맞춰 적어야 합니다.
컴파일러에 따라서 C++에서 C99의 기능을 쓸 수 있을지는... 음 잘 모르겠네요. 별로 기대 안하시는 게 좋을듯?
그렇담 구조체 초기화가 힘들다는 말씀
그렇담 구조체 초기화가 힘들다는 말씀 이신가요
Cpp방식대로라면 생성자가 넣어서 처리를 해야 한단 건가요?
nil.
그냥 하나씩 대입하면되지요.const 키워드를
그냥 하나씩 대입하면되지요.
const 키워드를 뺼수가 없는 상황이라면 하나씩 대입해서 다른 구조체를 생성한 다음에 얕은 복사하면되구요.
extern "C" const struct
extern "C" const struct sensors_module_t HAL_MODULE_INFO_SYM = {
.common = {
.tag = HARDWARE_MODULE_TAG,
.version_major= 1,
.version_minor= 0,
.id= SENSORS_HARDWARE_MODULE_ID,
.name= "------- sensor module",
.author= "------------- ----",
.methods= &s_module_methods,
},
.get_sensors_list= s_get_sensors_list
};
이런식으로 해도 에러가 나고 있습니다.(. 문자가 에러난다는게..참..)
얕은 복사라는게 초기화 해주는 부분에서, 해줘야 된다는 건가요?
현재 HAL_MODULE_INFO_SVM은 쓰는 부분이, 현재 소스코드에 있지 않고,
Framework에 포함되어 있는것으로 보여지거든요.
nil.
struct sensors_module_t
struct sensors_module_t HAL_MODULE_INFO_SYM;
HAL_MODULE_INFO_SYM.common.tag = HARDWARE_MODULE_TAG;
HAL_MODULE_INFO_SYM.common.version_major = 1;
...
이렇게요.
const를 뗄수 없으면, 저런식으로 다른 객체를 생성하고, 그냥 대입하면되겠지요.
struct sensors_module_t HAL_MODULE_INFO_SYM_tmp;
...
const struct sensors_module_t HAL_MODULE_INFO_SYM = HAL_MODULE_INFO_SYM_tmp;
음, 에러가 나네요 -_-;;
말씀하신대로 해봤는데, 에러가 나네요.
이거 도통 감잡기 힘듭니다. ㅡㅠ
struct sensor_module_t HMIS_tmp;
struct hw_module_t hwmodule_t;
hwmodule_t.tag = HARDWARE_MODULE_TAG;
hwmodule_t.version_major= 1;
hwmodule_t.version_minor= 0;
hwmodule_t.id= SENSORS_HARDWARE_MODULE_ID;
hwmodule_t.name= "-------- sensor module";
hwmodule_t.author= "-----------------";
hwmodule_t.methods= &s_module_methods;
hwmodule_t.reserved= {0,};
HMIS_tmp.common=hwmodule_t;
HMIS_tmp.get_sensors_list= s_get_sensors_list;
const struct sensros_module_t HAL_MODULE_INFO_SYM= HMIS_tmp;
------컴파일 결과
vendor/ASDF/GHJK/sensors.cpp:132: error: aggregate 'sensor_module_t HMIS_tmp' has incomplete type and cannot be defined
vendor/ASDF/GHJK/sensors.cpp:146: error: expected constructor, destructor, or type conversion before '.' token
vendor/ASDF/GHJK/sensors.cpp:147: error: expected constructor, destructor, or type conversion before '.' token
vendor/ASDF/GHJK/sensors.cpp:148: error: expected constructor, destructor, or type conversion before '.' token
vendor/ASDF/GHJK/sensors.cpp:149: error: expected constructor, destructor, or type conversion before '.' token
vendor/ASDF/GHJK/sensors.cpp:150: error: expected constructor, destructor, or type conversion before '.' token
vendor/ASDF/GHJK/sensors.cpp:151: error: expected constructor, destructor, or type conversion before '.' token
vendor/ASDF/GHJK/sensors.cpp:152: error: expected constructor, destructor, or type conversion before '.' token
vendor/ASDF/GHJK/sensors.cpp:153: error: expected constructor, destructor, or type conversion before '.' token
vendor/ASDF/GHJK/sensors.cpp:155: error: expected constructor, destructor, or type conversion before '.' token
vendor/ASDF/GHJK/sensors.cpp:156: error: expected constructor, destructor, or type conversion before '.' token
nil.
> struct sensor_module_t
> struct sensor_module_t HMIS_tmp;
> struct hw_module_t hwmodule_t;
> const struct sensros_module_t HAL_MODULE_INFO_SYM= HMIS_tmp;
여기서 struct 는 빼셔야지요. C 가 아닙니다. C++ 입니다.
질문을 읽어보니, 기본적인 C++ 공부를 좀 하셔야겠습니다. 너무 무대포로 개발에 달려드신 것 같습니다.
네, 알겠습니다.
이 참에 cpp를 다시 공부해야 된다는걸 느꼈습니다
그런데, 말씀하신대로 struct를 빼도 같은 에러가 나오는건 어쩌죠 ㅡ.ㅡ)a;;
nil.
구조체가 선언된 해더파일을 인클루드하세요.
구조체가 선언된 해더파일을 인클루드하세요.
이미 필요 헤더파일들을 다 올라와 있습니다.
이미 필요 헤더파일들을 다 올라와 있습니다. ^^;;
그리고 찾아보니, expected constructor, destructor, or type conversion before '.' token 관련 에러는
global 에 선언한 구조체를 global scope에서 값을 집어넣을 경우, 안된다고 합니다(왜 그런거지 ㅡ.ㅡ;)
http://www.codeguru.com/forum/archive/index.php/t-410918.html
현재, 이렇게 바꿔주니 전체빌드는 제대로 됩니다만, 뭔가 찜찜합니다. 에고...
nil.
...
소스를 고치는 게 곤란하다면, 그 부분만 떼어서 .c 파일로 만들고 C로 컴파일해서 링크하는 방법도 있겠네요.
저런 초기화 코드는 그냥 선언일 뿐이고 구조체의
저런 초기화 코드는 그냥 선언일 뿐이고
구조체의 인스턴스를 생성할때 초기화가 이뤄지는데
인스턴스를 생성하는 부분은 당연히 C++코드에서 일테고
이 방법은 적절할거 같지 않습니다.
...
정확히는 알 수 없지만 아마도 십중팔구 함수 밖에 나와 있는 global 변수일 것 같아서 말이죠. C에서는 프로그램 시작 시점에 이미 초기화가 완료되어 있는...
저런 초기화를 함수 안에서 하고 있다면 그건 그것 자체로 수상한 코드죠. (꼭 그럴 수밖에 없는 사정도 있을 수 있지만, 십중팔구 원작자가 변수 초기화 비용에 대한 개념이 없다든지...)
댓글 달기