我有很大的代码库,该代码库__FILE__广泛用于日志记录。但是,它包括完整路径,不需要(1),(2)可能会违反安全性。
我正在尝试编写编译时子字符串表达式。最终得到了这个解决方案
static constexpr cstr PastLastSlash(cstr str, cstr last_slash)
{
return *str == '\0' ? last_slash : *str == '/' ? PastLastSlash(str + 1, str + 1) : PastLastSlash(str + 1, last_slash);
}
static constexpr cstr PastLastSlash(cstr str)
{
return PastLastSlash(str, str);
}
// usage
PastLastSlash(__FILE__);
Run Code Online (Sandbox Code Playgroud)
效果很好,我检查了汇编代码,在编译时对行进行了修整,只有文件名以二进制形式出现。
但是,此表示法太冗长。我想为此使用宏,但失败了。上面链接中的建议示例
#define __SHORT_FILE__ ({constexpr cstr sf__ {past_last_slash(__FILE__)}; sf__;})
Run Code Online (Sandbox Code Playgroud)
不适用于MSVC编译器(我正在使用MSVC 2017)。使用c ++ 17还有其他方法吗?
UPD1:按功能https://godbolt.org/z/tAU4j7修剪的lang
UPD2:看起来可以使用函数在编译时进行修整,但是完整的字符串将以二进制形式出现。
我有一个代码,它可以在Qt 5.5上使用,而不能在Qt 5.2上使用。问题是这个枚举:
#include <QtCore/QMetaType>
enum Area
{
Area_A,
Area_B,
Area_C
};
Q_DECLARE_METATYPE(Area)
Run Code Online (Sandbox Code Playgroud)
然后,我有一个对象,它公开了这个area属性:
class MyClass : public QObject
{
Q_OBJECT
Q_PROPERTY(Area area READ area WRITE setArea NOTIFY areaChanged)
public:
explicit MyClass(QObject *parent = 0)
: QObject(parent), m_area(Area_A){}
Area area() const { return m_area; }
void setArea(Area area) {
m_area = area;
emit areaChanged(area);
}
signals:
void areaChanged(Area area);
private:
Area m_area;
};
Run Code Online (Sandbox Code Playgroud)
和main.cpp:
#include <QtGui/QGuiApplication>
#include <QtQml/QQmlApplicationEngine>
#include <QtQml/QQmlContext>
#include <QtQml/QtQml> …Run Code Online (Sandbox Code Playgroud)