如何在 C 或C++宏中使用函数作为文字字符串
how to use function as literal string in C or C++ macro
我昨天发布了一个类似的问题,该网站建议发布一个新问题,并提供更好的解释。
有两个宏:
#define COMPANY L"Test Company"
#define PRODUCT COMPANY L" in Canada"
产品的结果将是"加拿大的测试公司"。
现在,我们有以下要求:
- 使 COMPANY 成为"动态"字符串,调用函数返回公司名称,例如 #define COMPANY getCompanyName()
- 我们不允许更改其他代码来引用公司,例如 #define 产品公司L"在加拿大",因为代码中有太多宏
更改的问题:PRODUCT的结果将是"测试公司",失去部分"在加拿大"字面。
这是代码:
#include <stdio.h>
#include <tchar.h>
const wchar_t* getCompanyName() { return L"Test Company";};
#define COMPANY getCompanyName();
#define PRODUCT COMPANY L" in Canada"
int _tmain(int argc, _TCHAR* argv[])
{
const wchar_t * company = COMPANY; // get Test Company
const wchar_t * product = PRODUCT; // get Test Company in Canada
wprintf(company);
wprintf(product);
return 0;
}
这是一个令人讨厌的黑客,但实际上是可能的。定义表达式的COMPANY
,该表达式以文本开头,以文本结尾,并且可以隐式转换为const wchar_t *
:
#define COMPANY L"" + getCompanyName() + L""
当然getCompanyName()
不能返回const wchar_t *
,因为operator+
不是为两个指针定义的,无论如何它都可以处理地址而不是字符串。
你基本上需要std::wstring
,但你可能需要它可以转换为const wchar_t *
,而std::wstring
不是。所以你必须定义自己的类:
struct AutoConvertibleString {
std::string s;
AutoConvertibleString(const std::string &s) : s(s) {}
// C++ optimization for move:
// AutoConvertibleString(std::string s) : s(std::move(s)) {}
operator const wchar_t *() { return s.c_str(); }
};
AutoConvertibleString operator+(const wchar_t *l, const AutoConvertibleString &r) {
return (l + r.s).c_str();
}
AutoConvertibleString operator+(const AutoConvertibleString &l, const wchar_t *r) {
return (l.s + r).c_str();
}
// Ok, the operator+s could be optimized to use move for temporaries too...
AutoConvertibleString getCompanyName() { /* ... whatever ... */ }
这是一个丑陋的黑客。将它们全部转换为函数确实会更好。但它应该有效。
你PRODUCT
宏展开
getCompanyName(); L" in Canada"
所以
const wchar_t * product = getCompanyName(); L" in Canada";
wprintf(product);
指纹
Test Company
不出所料。
在C++,我们倾向于:
- 避免宏(改用内联函数)
- 避免裸指针(首选 STL 设施)
因此,在C++中,我们更喜欢:
inline const std::wstring getCompanyName() { return L"Test Company";}
inline const std::wstring PRODUCT() { return getCompanyName() + L" in Canada";}
相关文章:
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何从void函数输出字符串
- 使用用户定义函数的字符串反转
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- 在c++构造函数中使用随机字符串生成器
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- C++:如何使函数只返回作为列表一部分的字符串
- 如何在C++中的同一函数中使用字符串和双精度
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 一个函数,用于查找字符串1包含字符串2 c++的次数
- 对函数 PlaySound 使用字符串变量
- 具有多个模板的模板函数,用于特定数据类型(如字符串)?
- 字符串化递归的"std::vector<std::vector<...>>"而不使用部分模板函数专用化
- Visual c ++,使用字符串引用/指针调用 dll 函数
- 构造函数字符串参数未设置窗口标题
- C++默认构造函数:字符串参数与字符串参数()
- 使用函数C++字符串输入
- c++模板函数字符串类型不匹配