试图从__FILE__中删除项目路径

时间:2013-12-19 00:41:11

标签: c++ stl

以下代码(main.cpp):

#include <string>
#include <vector>

std::vector< std::string > split( std::string haystack, const char limiter ) {
    std::vector< std::string > return_value;

    while( haystack.find( limiter ) != std::string::npos ) {
        return_value.push_back( haystack.substr( 0, haystack.find( limiter ) ) );
        haystack = haystack.substr( haystack.find( limiter ) + 1 );
    }

    return_value.push_back( haystack );

    return return_value;
}

const char* str = split( std::string( __FILE__ ), '/' ).back().c_str();

int main() {
    printf( "%s\n", str );
    return 0;
}

总是返回“iso_a3”并且我不知道为什么......基本上,我想要做的是定义一个输出文件名的LOG-macro,并在开头计算项目基本目录的长度以减去它像这样:__FILE__[ _base_directory_length ]以便输出更具可读性,确切地说:

Debug.h

#pragma once

static int _base_directory_length = strlen( __FILE__ ) - split( __FILE__, '/' ).back().length();

#define LOG( message ) { \
    printf( "%s(%i): %s ", __FILE__ + _base_directory_length, __LINE__, __func__ ); \
    printf( message ); \
    printf( "\n" ); \
}

这是否有意义:-)? BTW _base_directory_length = strlen( __FILE__ ) - strlen( "Debug.h" )是不够的。

3 个答案:

答案 0 :(得分:0)

__FILE__[ _base_directory_length ]将返回一个字符。

也许你想要&__FILE__[ _base_directory_length ]'。

答案 1 :(得分:0)

好的,我很抱歉打扰了,本来应该更加专注。这就是我真正想要做的事情:

项目根目录中的Debug.cpp:

#include <cstring>

/* calculate the length of the root directory string */
int _path_length = strlen( __FILE__ ) - strlen( strrchr( __FILE__, '/' ) ) + 1;

Debug.h

extern int _path_length;

#define LOG( message ) {
    printf( "%s(%i): %s:\t", __FILE__ + _path_length, __LINE__, __func__ );
    printf( message ); /* message may be a variadic list of arguments */
    printf( "\n" );
}

子目录中的所有其他文件现在似乎输出正确的路径,Debug.cpp的位置是项目根目录。

再一次,为我的愚蠢问题道歉并感谢您的回复。

答案 2 :(得分:0)

好像很奇怪。我复制了第一段代码并在我的主机上运行,​​我得到了“main.cpp”。

为什么不做一些调试?如果你想使用gdb,你可以简单地将str和你放入return_value的每个元素打印出来。