【问题标题】:Trying to strip project path from __FILE__试图从 __FILE__ 中删除项目路径
【发布时间】:2014-01-07 10:01:14
【问题描述】:

以下代码(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 ],准确地说,输出更具可读性:

调试.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" ); \
}

这有意义吗:-)?顺便说一句 _base_directory_length = strlen( __FILE__ ) - strlen( "Debug.h" ) 还不够。

【问题讨论】:

  • __FILE__ 的值是多少?
  • 该死的,stackoverflow,两个下划线意味着要以粗体字打印。
  • FILE 是一个由编译器定义的宏...被替换为宏被替换的文件的相应名称。 IE。 /home/john/devel/project1/main.cpp
  • @user3116736 用反引号 (`) 环绕你不想被 Markdown 格式的东西,使它看起来像这样:__FILE__

标签: c++ stl


【解决方案1】:

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

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

【讨论】:

  • AFAIK 它仍然应该返回一个指针,它仍然可以作为 c 字符串访问。
  • 不,[] 取消引用指针并为您提供对该地址的值的引用。
【解决方案2】:

看起来很奇怪。我复制了第一个 sn-p 代码并在我的主机上运行,​​我得到了“main.cpp”。

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

【讨论】:

    【解决方案3】:

    好的,很抱歉打扰了,我自己应该更专心一点。这是我真正想做的:

    项目根目录下的Debug.cpp:

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

    调试.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 的位置是项目根目录。

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

    【讨论】:

    • 虽然问题依然存在,但为什么我的函数返回 iso_a3。生活是个谜。
    • printf( "%f(%i): %f" - 您的问题中有(正确)"%s"。另外,谁不只使用const char* filename = strchr(__FILE__, '/') + 1 而跳过所有strlen()__FILE__ + 业务?
    • 您在格式化字符串方面是绝对正确的,但您的建议根本不起作用。我希望 /home/john/devel/testproject/Gui/widget.cpp 输出 Gui/widget.cpp,但是由于 strchr 似乎找到了第一次出现的字符,我能从这个中得到的只是 home/john/devel /testproject/Gui/widget.cpp 开头没有斜线。
    • strlen 是不必要的,我会使用 sizeof() -1 代替,也是为了性能
    • 啊抱歉 - 我正在考虑并打算输入 strrchr,它从字符串的右端搜索,但如果你想要 Gui/widget.cpp 而不是 widget.cpp(你真的应该已经在您的问题中明确表示;-P),您需要使用它两次...const char* p = __FILE__; const char* q = strrchr(p, '/'); if (q) { while (q &gt; p &amp;&amp; *(q-1) != '/') --q; p = q; } - 回答q
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    相关资源
    最近更新 更多