c++宏中的字符串修改
String modification in C++ macro
是否有办法从宏修改c++中的字符串文字?
这样做的原因是混淆代码,特别是两个互斥对象的愿望:
- 我想看到的字面值是在我的源代码,说,"password123"。
- 我希望在编译之前以某种方式对它们进行处理,以避免在二进制文件中包含它们。
我知道像异或或移位这样的原始修改不足以进行专业分析,但它们对我来说已经足够好了。
您可以创建一个实际上不做任何事情的宏,但使用宏作为自定义构建步骤(简单的脚本可能会这样做)的"标记",以便在预处理器获得源代码之前混淆字符串。
您可以使用宏将字符串传递给执行"加密"的constexpr
函数。从c++ 14开始,constexpr
更容易使用了。
// Similar to std::array, but with a member pointer as an accessor.
// It's complicated.
template< std::size_t length >
struct string_holder {
char str[ length ];
char const * ptr = str;
};
template< std::size_t length >
constexpr string_holder< length > encrypt( char const (& in)[ length ] ) {
string_holder< length > result = {};
for ( std::size_t i = 0; i != length - 1; ++ i ) {
result.str[ i ] = in[ i ] ^ 1; // Do encryption here.
}
return result;
}
#define ENCRYPT( STR ) ( encrypt( STR ).ptr )
char const * const & s = ENCRYPT( "password123" );
http://coliru.stacked-crooked.com/a/3b6f6753d9f722cb 注意,s
需要声明为const&
引用来利用生命周期延长。你也可以写auto const& s
或auto &&s
;这是一样的。Clang的当前版本不允许将s
声明为constexpr
,但我相信这是一个错误。
理想情况下,可以只写一个用户定义的字面值,如"password123"_encrypted
。不幸的是,实现这方面的底层语言特性进展缓慢。
相关文章:
- 我应该如何修改此代码以使用给定字符串中的字母打印菱形图案
- 如何修改 lambda 内部字符串的向量
- 修改向量中的字符串?(不使用循环)
- 如何在不进行任何其他修改的情况下"pretty print" C++的XML字符串?
- 如何找到修改后的字符串与原始字符串相等的时间
- 根据平台目标修改OriginalFilename字符串
- 在C++中修改字符串的BigO时间复杂度是多少
- 修改字符串数组中的字符串
- 在 c++ 中,std::string::size() 不计算修改后的字符串长度
- 从字符串修改char数组
- C++,字符* 字符串修改
- 是否可以修改字符串输入?
- 如何从线程修改字符串
- c++ 修改字符串以包含整数的字符串 repr.
- 在 c++ 中修改字符串向量的元素
- 使用指针修改 C++ 初学者---字符串
- Strtok似乎没有修改输入字符串
- 修改 gettext .pot 文件输出以排除空字符串或仅包含空格的字符串
- 错误:表达式必须是可使用字符串修改的左值
- c++宏中的字符串修改