2014-01-16 7 views
1

이 나에게 불가능 보이지만, StackOverflow의 전에 나에게 불가능 듯 일을 해결했다 매핑의 __file__, 그래서 여기 간다 : C++ : 미리 정의 된 번호

내가 파일 이름과 ID 사이에 미리 정의 된 매핑이, 내가 좋아하는 것 가능한 경우 모두 __FILE__을 컴파일 타임에 id에 매핑 할 수 있습니다.

죄송합니다 겉만 번지르르 한 설명은, 내가 예를 들어이 도움이되기를 바랍니다 : 내가 할 수 있도록하고 싶습니다

#define _FILE_IDS_MAIN_CPP 1 
#define _FILE_IDS_HELPER_CPP 2 
#define _FILE_IDS_HELPER_HPP 3 

코드에서 : 컴파일 과정이 일부 스크립트를 통해 시작하기 전에

ID를 생성 이 같은 :

printf("%d", GET_FILEID_MACRO(__file__)); 
+2

당신이 예를 줄 수를 당신이 쓰고 싶은 코드를? –

+0

@sftrabbit 예제를 추가했습니다. 죄송합니다. 더 명확하지 않았습니다. – Afiefh

+0

컴파일 시간에 있어야합니까? – JorenHeit

답변

0

당신은 아마 파일 이름에 대한 몇 가지 계산을 수행하기 위해, C++ 11부터 사용할 수 constexpr 기능을 사용할 수 있습니다, 당신은 시작하려면 문자. 당신은 단순히 문자열 길이가 귀하의 ID를하자 예를 들어, 당신은 할 수 :

template <unsigned int N> 
constexpr unsigned int FileID(char const (&a)[N]) 
{ 
    // your computation goes here 
    return N; 
} 

#include <iostream> 
template <unsigned int N> void print() 
{ 
    std::cout << "Static value: " << N << "\n"; 
} 

int main() 
{ 
    print<FileID(__FILE__)>(); 
} 

print 템플릿 수는 컴파일시에 계산되는 것을 증거로 포함되어 있습니다.

이것을 시작점으로 사용하면 FileID을 일종의 해시 함수로 변경하거나 정적지도 조회로 변경할 수 있습니다. 이는 확실히 자세한 것은 있지만 확실히 가능합니다. 나는 누군가가 이미 그것을했다고 확신합니다.

+0

내가 틀렸다고 정정하되 동일한 이름의 모든 파일을 동일한 ID로 매핑하지 않습니까? 또한 저는 C++ 98을 고집하여 C++ 11의 장점을 얻지 못합니다 .- ( – Afiefh

+0

@Afiefh : 그렇습니다. 그래서 그것이 작업해야 할 출발점이라고 말한 것입니다. PHP를 작성하면 완료됩니다.) –

0

갖는 C++ 11 :

#include <cstring> 
#include <iostream> 

constexpr unsigned id(const char* file) { 
    return (std::strcmp(file, "One") == 0) ? 1 : 0; 
} 

template<unsigned> 
void print() { 
    std::cout << "Zero\n"; 
} 

template<> 
void print<1>() { 
    std::cout << "One\n"; 
} 

int main() { 
    print<id("Zero")>(); 
    print<id("One")>(); 
    return 0; 
} 

는 strcmp와는 constexpr 기능에 유효한 경우 확실 존재와 @MSalters에서 링크에서 두 번째 대답은 다음

#include <iostream> 

// Code from @Robert Mason 
// ======================= 

constexpr bool static_strequal_helper(const char * a, const char * b, unsigned len) { 
    return (len == 0) ? true : ((*a == *b) ? static_strequal_helper(a + 1, b + 1, len - 1) : false); 
} 

template <unsigned N1, unsigned N2> 
constexpr bool static_strequal(const char (&str1)[N1], const char (&str2)[N2]) { 
    return (N1 == N2) ? static_strequal_helper(&(str1[0]), &(str2[0]), N1) : false; 
} 

// End 


template <unsigned N> 
constexpr unsigned id(const char (&file)[N]) { 
    return (static_strequal(file, "One")) ? 1 : 0; 
} 

template<unsigned> 
void print() { 
    std::cout << "Zero\n"; 
} 

template<> 
void print<1>() { 
    std::cout << "One\n"; 
} 

int main() { 
    print<id("Zero")>(); // Prints Zero 
    print<id("One")>(); // Prints One 
    print<id(__FILE__)>(); // Prints Zero - Is __FILE__ always an array? 
    return 0; 
} 
+0

와우, 좋은 점은 표준에 의해 작동한다는 것입니까? –

+0

아니요, http://stackoverflow.com/questions/11144118/c-compare-two-string- 리터럴 – MSalters

관련 문제