0
전처리 지시문 ##
을 사용하여 네임 스페이스를 클래스 이름과 연결할 수 있습니까?C 사전 처리기를 사용하여 네임 스페이스와 클래스 이름 연결 ## (이중 해시)
namespace ns {
class A
{
public:
void print(){ std::cout << "A" << std::endl; };
};
}
#define PRINT_NS(E) ([](){ ::ns::##E e; e.print(); }())
int main()
{
PRINT_NS(A);
}
그것은 다음과 같은 컴파일 오류를 제공합니다 :
나는 내가하고 싶은 것을 표시하려면이 예를 작성했습니다
그것은::
에 의해 고려되지 전에 무엇이든처럼 보이는
13:30: error: pasting "::" and "A" does not give a valid preprocessing token
17:3: note: in expansion of macro 'PRINT_NS'
##
. ::
가 아닌 전처리 토큰 처리기가 잘 E (working example를) 대체 할 수 있기 때문에이 경우
은 왜 그렇지 않으면 하나의 토큰으로 처리됩니다 부품이 같은 접착제하려면 '## '로 연결하려고합니까? 당신이 그렇게하지 않는다면 대신':: ns :: E' [그냥 잘 동작합니다] (http://ideone.com/2uzmrP)를 실행하십시오. – Cornstalks
코드 생성기에서'##'을 사용하여 클래스 이름, 함수 이름 등의 이름 공간이든 관계없이 항상 동일한 방식으로 접두어를 추가하려고했습니다. – Martin
@Martin이 경우 코드 생성기는 접두어가'::'로 끝나고 적절한 코드를 생성해야하는지 여부. C++ 매크로를 사용하여 이것을 처리하는 것보다 마침내 쉬운 해결책이라고 생각합니다. 코드 생성기를 변경할 수있는 옵션입니까? – Scheff