음 ... C에서는 데이터 구조를 설명하는 데 코드가 필요한 모든 장소에서 매우 유용합니다. 예 : 옵션을 설정하기 위해 런타임 생성 GUI를 수행한다.
이 작업은 다음과 같습니다. 옵션이 필요한 명령은 옵션을 포함하는 로컬 구조를 정의한 다음 해당 필드를 나타내는 offsetof
을 사용하여 구조를 GUI를 생성하는 코드에 설명합니다. 절대 주소가 아닌 오프셋을 사용하면 GUI 코드가 구조체의 인스턴스와 함께 작동 할 수 있습니다.
예를 들어 (시도했지만) 재빨리 스케치하기가 어렵지만 주석에 예제가 순서대로 있음을 나타내므로 다시 시도 할 것입니다.
"명령"이라고하는 독립형 모듈이 있으며 응용 프로그램에서 일부 동작을 구현한다고 가정합니다. 이 명령에는 그래픽 사용자 인터페이스를 통해 사용자에게 노출되어야하는 일반 동작을 제어하는 여러 옵션이 있습니다. 이 예의 목적을 위해, 애플리케이션이 파일 관리자이고, 명령이 예를 들어, "부".
아이디어는 복사 코드가 하나의 C 파일과 GUI 코드에 있고 GUI 코드가 복사 명령 옵션을 "지원"하기 위해 하드 코딩 될 필요가 없다는 것입니다. 대신, 우리가 같이 복사 파일의 옵션을 정의 :
struct copy_options
{
unsigned int buffer_size; /* Number of bytes to read/write at a time. */
unsigned int copy_attributes; /* Attempt to copy attributes. */
/* more, omitted */
};
static struct copy_options options; /* Actual instance holding current values. */
그런 다음, 복사 명령은 GUI 모듈의 구성 설정을 등록합니다 다음
void copy_register_options(GUIModule *gui)
{
gui_command_begin(gui, "Copy");
gui_command_add_unsigned_int(gui, "Buffer size", offsetof(struct copy_options, buffer_size));
gui_command_add_boolean(gui, "Copy attributes", offsetof(struct copy_options, copy_attributes));
gui_command_end(gui);
}
,의는 사용자가 요청 가정 해 봅시다 copy 명령의 옵션을 설정하십시오. 우리는 먼저, 현재의 옵션을 복사 할 수 있습니다 취소를 지원하고,이 명령의 옵션 편집에 적합한 실행 시간에 구축 된 대화 지주 컨트롤의 GUI 모듈을 물어 : 물론
void copy_configure(GUIModule *gui)
{
struct copy_options edit = options;
/* Assume this opens a modal dialog, showing proper controls for editing the
* named command's options, at the address provided. The function returns 1
* if the user clicked "OK", 0 if the operation was cancelled.
*/
if(gui_config_dialog(gui, "Copy", &edit))
{
/* GUI module changed values in here, make edit results new current. */
options = edit;
}
}
를이 코드는 가정 설정은 순수한 값 유형이 될 수 있으므로 간단한 구조 지정을 사용하여 구조체를 복사 할 수 있습니다. 동적 문자열도 지원하는 경우 복사를 수행하는 함수가 필요합니다. 구성 데이터에 대한 모든 문자열은 구조체에 정적으로 배열 된 char
배열로 표현하는 것이 가장 좋을 것입니다.
GUI 모듈이 오프셋으로 표현 된 각 값의 수명을 알 수 있다는 사실을 통해 대화 상자 기능에 임시 온 스택 복사본을 제공 할 수 있습니다. 우리가 대신 GUI 모듈을 각 필드에 대한 직접 포인터로 설정했다면 이것은 유연성이 훨씬 떨어질 수 있습니다.
첫 번째 사용은 C에서 합법적이지만 C++에서 포인터를 사용하면 거의 필요가 없습니다. –
여기에 대한 다른 질문이 있습니다 : http://stackoverflow.com/questions/400116/what-is-the-purpose-and-return-type-of-the-builtinoffsetof-operator –