【问题标题】:base file name from __FILE__来自 __FILE__ 的基本文件名
【发布时间】:2014-12-15 21:59:47
【问题描述】:

我只需要__FILE____FILEW__ 宏返回整个路径的文件名。

我定义了以下内容:

#define __FILE_NAME_ONLY__ (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__)

我是这样使用的:

#define MY_TRACE( mask, format, ... )  \            
            GlobalTrace( mask, L"-[" __FILE_NAME_ONLY__ L":" format , __VA_ARGS__ ) 

我收到以下错误:

错误 C2064:术语不计算为采用 1 个参数的函数

当我尝试以下宏时:

#define __WIDE(_String) L ## _String
#define _WIDE(_String) __WIDE(_String) 

如下

 #define MY_TRACE( mask, format, ... )  \            
                GlobalTrace( mask, L"-[" _WIDE(__FILE_NAME_ONLY__) L":" format , __VA_ARGS__ ) 

当我实际尝试使用 MY_TRACE 宏时,我得到:error C2146: syntax error : missing ')' before identifier 'L'

我错过了什么?谢谢

【问题讨论】:

    标签: c++ windows macros predefined-macro


    【解决方案1】:

    您依赖于字符串文字连接,但所有术语都不是字符串文字。

    我假设你以前是这样做的:

    #define MY_TRACE( mask, format, ... )  \            
                GlobalTrace( mask, L"-[" __FILE__ L":" format , __VA_ARGS__ ) 
    

    如果 __FILE__format 扩展为字符串文字,则 4 个字符串将粘贴在一起。 "A" "B" "C" "D""ABCD" 相同。

    __FILE_NAME_ONLY__ 替换时不会发生这种情况,因为它扩展为函数调用,而不是文字。

    【讨论】:

    • 在我使用__FILEW__之前,因为字符串很宽
    • @Saher 没关系,它们都评估为字符串文字。只是不同种类的字符串。
    • 那么如何让它工作__FILE_NAME_ONLY__(__FILE__)没有解决它
    • @Saher 将字符串转换为wstring 并使用连接运算符+
    • hmmm 我认为没有这种转换它应该可以工作。我上面是一个例子。我正在使用/连接许多其他工作正常的值,现在我需要转换所有内容。如果可能的话,我更喜欢让它工作
    【解决方案2】:

    如果你使用 gcc,这个宏应该会有所帮助:

    __BASE_FILE__
    

    这是一个有用的list

    【讨论】:

    • +1 从 -1 分数重置。不是世界上最好的答案,(如“42”)但也不错 - 一些使用 Windows 的 GCC 人可能会从中受益。
    • 很高兴知道帮助别人不是人气竞赛;)
    猜你喜欢
    • 2012-11-09
    • 2022-01-23
    • 1970-01-01
    • 2013-03-03
    • 2018-09-30
    • 2014-10-14
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多