2012-09-04 3 views
0

함수 정의를 대체 할 매크로를 만들려고합니다. 이 매크로는 어떤 배열에 함수의 이름을 등록하여 다른 매크로가 배열 요소로 뭔가를 할 수있게합니다.전 처리기 배열 생성

새로운 기능을 추가 할 때마다 목록을 편집 할 필요없이 콘솔에서 사용할 수있는 기능 목록을 갖기 위해이 기능을 사용하고 싶습니다. 실제로는 여러 목록입니다.

조금 읽은 후 부스트 전 처리기를 살펴 보았습니다. 불행히도 새 배열을 '저장할'방법이 없다고합니다. (난 경우에 저를 수정하시기 바랍니다

#define SOME_ARRAY (0,()) 
#define CONSOLE_COMMAND(a) \ 
    #redefine SOME_ARRAY BOOST_PP_ARRAY_PUSH_BACK(SOME_ARRAY, #a) \ 
    void a(some_arguments) 

불행하게도, 내 지식, 존재하지 않는 재정의하고 #DEFINE 매크로에서 사용할 수 없습니다 : 내가하고 싶은 무엇 이 같은 것입니다 잘못된).

부스트의 프리 컴파일러의 SLOT을 살펴 보았지만 일단 설정하면 변수를 변경할 수 있다고 생각하지 않습니다.

내 전처리기를 쓰는 것 외에 다른 방법이 있습니까? 그렇습니다. 어떻게 작성하는 것이 좋을까요? (Code :: Block과 함께 MinGW 사용).

+4

전 처리기를 사용하지 않고도 문제를 쉽게 해결할 수있는 방법이 있습니다. 왜 그 문제를 설명하지 않니? – jrok

답변

3

비슷한 일을하는 일반적인 방법은 특수 매크로를 사용하여 헤더 파일에 함수를 선언하는 것입니다. 이 매크로는 포함 된 소스 파일에 따라 다르게 정의됩니다. 일반적으로 표준 함수 프로토 타입을 정의하지만 특수 소스 파일에 포함되면 테이블에 항목을 추가하도록 정의됩니다. 이 같은

뭔가 :

// functions.h 
#ifndef FUNCTION_H_ 
#define FUNCTION_H_ 

#ifndef FUNCTION 
# define FUNCTION(name) \ 
    void name(const std::vector<std::string> &); 
#endif 

FUNCTION(foo) 
FUNCTION(bar) 

#endif 

// functions.cpp 
// File that defines the function table 

#include <functional> 

using function_type = std::function<void(const std::vector<std::string> &)>; 

#define FUNCTION(name) \ 
    { #name, name }, 

std::map<std::string, function_type> functions = { 
#include "functions.h 
}; 

이제 함수 이름에 의해 인덱스 기능에 std::map 포함하는 포인터를 가지고있다.

그래도 여전히 함수의 "목록", 즉 functions.h에있는 프로토 타입 목록을 유지해야하지만 기능을 추가 (또는 제거)하면이 목록을 "수정"하는 것이 매우 쉽습니다.

0

전 처리기는 기호를 다시 정의 할 수 없으므로 파일을 통과하는 값을 누적하는 데 사용할 수 없습니다.

한 가지 가능한 솔루션은 X-매크로 기법으로 재정의과 자기 다시 포함을 사용하는 것입니다 : 파일 범위 누구의 생성자 등록 객체로 명령을하는 것입니다

#define CONSOLE_COMMAND(a,body) \ 
    void a(some_arguments) body 

CONSOLE_COMMAND(my_command, { ... }) 

const char *array[] = { 
#undef CONSOLE_COMMAND 
#define CONSOLE_COMMAND(a,body) #a , 
#include __FILE__ 
}; 

더 관용적 C++ 솔루션 프로그램 시작 시간에.

+0

그래서 내가 정확히 이해한다면 요아킴 Pileborg의 해결책과 같은 개념입니다 : 정의를 변경하고 배열에 다시 포함 시켜서 이제는 원하는 항목이되도록하십시오. 나는 COMMAND_NAME과 COMMAND_DEFINITION이 무엇을위한 것인지 정말로 이해하지 못한다. – DrBearhands

+0

@DrBearhands oops, 무시합니다. – ecatmur