2012-01-19 4 views
4

C++로 코딩 된 게임을 진행하고 있으며 런타임에 언어를 변경할 수있게하려고합니다. 현재, 언어과 같이, 헤더 파일을 (언어 정의를 가지고있는) 포함하여 컴파일시에 선택 :C++ 조건부 파일 런타임 포함

#include "lan_eng.h" 

따라서, 게임은 클라이언트가 컴파일 된 후 언어가 변경 될 수 없습니다. 내 질문은 런타임에 조건부로 파일을 포함 할 수있는 방법이 있다면 무엇입니까? 쉽게 유지할 수

#define DEF_LANGUAGE_ENG 
//#define DEF_LANGUAGE_DEN 

#ifdef DEF_LANGUAGE_ENG 

    #include "lan_eng.h" 

#endif 

#ifdef DEF_LANGUAGE_DEN 

    #include "lan_den.h" 

#endif 

물론 이죠,하지만 문제는 내가 단지 컴파일시에 작동하는 생각이다 : 나는 같은 것을 할 수 있다고 생각하고 있었다 처음에는 그래서 나는, C++에 새로운 오전. 선택한 언어를 런타임에 변경되는 변수에 저장 한 다음 해당 변수를 사용하여 포함 할 헤더 파일을 선택할 수 있기를 원합니다. 헤더 파일을 사용하여이 작업을 수행 할 수있는 방법이 있습니까, 아니면 수업을 강요해야합니까?

나는 그것이 바보 같은 질문이 아니길 바란다. 내 검색 결과가 나에게 내가 원하는 결과를주지 못했습니다.

미리 감사드립니다.

+1

전 처리기는 프로세스를 구축하는 첫 번째 단계입니다. 따라서 AFAIK, 헤더의 런타임 포함이 가능하지 않을 수 있습니다. – Mahesh

답변

5

컴파일 타임에만 평가되므로 런타임시 # include를 변경할 수 없습니다.

대신 할 수있는 작업은 "언어 시트"입니다. 런타임 중에 참조하는 시스템을 구축하거나 언어를 변경하려는 경우 읽고 저장하는 여러 텍스트 문서 (예 : .xml 파일)를 가질 수 있습니다. 이 방법을 사용하면 하드 코딩되지 않으므로 나중에 소프트웨어 사용자가 응용 프로그램을 확장 할 수 있습니다.

그런 식으로 디자인하면 모든 "언어 시트"를 한 폴더에 보관 한 다음 사용 가능한 언어 시트가 있는지 폴더를 확인할 수 있습니다. 이렇게하면 사용자가 프로그램에 언어를 추가 할 수 있습니다.

기본적으로 수행해야 할 작업은 하드 코딩 된 메서드의 일부로 수행 할 수있는 문자열 테이블을 만드는 것 또는 더 동적 인 메서드 (언어 시트라고도 함)의 일부로 수행하는 것입니다.

3

#include으로는 수행 할 수 없습니다. 컴파일 시간에만 적용됩니다. 좀 더 구체적으로 말하자면, 이것은 전 처리기 전용이며 컴파일 전 발생합니다.

런타임 변형을 얻으려면 번역본을 텍스트 파일 (아마도 xml과 비슷하지만 일반 텍스트도 사용할 수 있음)로 이동하고 시작시 파일을로드하여 문자열을 채우는 시스템을 설정해야합니다 번역이 필요한 코드에서

이것은 또한 모든 문자열이 시작시 동적으로 크기가 지정되므로 코드의 초기화 기간이 늘어납니다. 그러나 그것은 때때로 유연성의 비용입니다.

3

아마도 내가 생각했던 가장 쉬운 방법은 다음과 같습니다

struct language { 
    virtual str::string greeting() =0; 
    virtual str::string greeting(const std::string& name) =0; 
    virtual str::string goodbye() =0; 
    virtual ~language() {} 
}; 
struct English_language { 
    virtual str::string greeting() {return "Hello";} 
    virtual str::string greeting(const std::string& name) {return "Hello "+name;} 
    virtual str::string goodbye() {return "Goodbye";} 
} English; 
struct German_language { 
    virtual str::string greeting() {return "Hallo";} 
    virtual str::string greeting(const std::string& name) {return name+" Hallo";} 
    virtual str::string goodbye() {return "Auf Wiedersehen";} 
} German; 
language* CurLanguage = &English; 

int main() { 
    std::cout << CurLanguage->greeting("Steve") << '\n'; 
    CurLanguage = &German; 
    std::cout << CurLanguage->goodbye() << '\n'; 
} 

[편집] 나는 순수 가상 함수를 사용하면 문장을 놓칠 경우 컴파일 타임에 오류가하는 방법입니다 실현 때문에, 처음부터 다시 썼다 유지 보수가 훨씬 간단 해졌습니다. 이 버전에는 변수 (날짜, 이름, 시간, 숫자 등)를 깔끔하게 처리 할 수있는 기능이 있습니다. 이 개념은 ~ 20 개 언어로 2900 개 이상의 구/문장에 대해 우리가 직장에서 사용하는 것을 기반으로합니다.

+0

불행히도 번역 할 단계가 많기 때문에이 솔루션은 적합하지 않습니다. 말하듯이 소규모 프로젝트에 유용합니다. 아이디어를 가져 주셔서 감사합니다. :) – Andy0708

0

사전 처리 (#include, #ifdef, #define 등)는 컴파일하기 전에 실제로 발생합니다.전처리는 텍스트 대체로 생각할 수 있으며, 출력은 컴파일러에 공급되는 소스 코드입니다. #defines 등은 프로그램에서 변수와 별도의 네임 스페이스를 차지하며, 프로그램 컴파일 시점까지는 모두 돌로 설정됩니다. 즉, 당신이 요구하는 것은 불가능합니다.

이 내용을 더 잘 이해하려면 컴파일러 옵션을 살펴보고 사전 처리 된 출력을 유지할 수있는 옵션을 찾아보십시오.

대신 문자열 처리 방식을 변경해야합니다. 컴파일 타임에 문자열을 변경하는 대신 런타임에 무언가를해야합니다.

플랫폼을 확인하십시오. 대부분의 플랫폼에는 현지화를위한 API가 있습니다. 플랫폼에 따라 차이가 있지만 크로스 플랫폼 앱을 사용하는 경우에는 자신의 앱을 굴려야 할 수도 있습니다.

+0

고맙습니다 - 매우 유용합니다! :) – Andy0708