mfc中CString如何转化为const char*类型?为什么样像 Java、C、C++ 这样的静态语言会比 Python、Ruby 这样的动态语言流行得多

初学者就好好啃书吧,或者去CSDN问问也比这强。基本功不扎实导致的问题,就算帮你解答①个,也有千百个在后面等着。
----------------------------------
知乎这个风气也是够够的,实在忍不住补充点说明。
首先 CString 作为 MFC/ATL 标配的字符串类,是可以方便转换成字符串指针来用的,但注意这里有个小坑,就是某些答主提到的GetBuffer,不应该这么用。
CString::GetBuffer 的作用,是锁定字符串缓冲区,得到①个可安全修改的指针,用完之后必须 ReleaseBuffer。如果只想把CString强转成const char *,考虑到你现在的编译环境是Unicode编码,分成几种情况。
CString str(\"ABC\");
①.
// 这种方法转出的指针,在 str 被修改前都是安全的,建议不要像这样保存指针,应即用即转。const wchar_t * wp = (LPCTSTR)str;const char *p = (LPCSTR)wp;send(socket, p, ⑥ · ⓪);// 这样用更合理send(socket, (LPCSTR)(LPCTSTR)str, ⑥ · ⓪);由于当前编译环境为 Unicode,CString 实际上是 CSringW,虽然强转成了 const char *,但你实际发出去的字符串是 \"A⓪B⓪C⓪\"⑥个字节。
②.
你就是想发出 \"ABC\"③个字节,那就必须用 API 把Unicode字符串转换成ANSI字符串再发送。
CString str①(\"ABC\");// 定义①个缓冲区来保存转换后的字符串CStringA strA;// 思考①下为什么长度要 *②DWORD ansiLength = str①.GetLength() * ②;// 把 Unicode 字符串转换为 ANSI 字符串,存入 StrA 中WideCharToMultiByte(CP_ACP, ⓪ · (LPCWSTR)str① · -① · strA.GetBuffer(ansiLength), ansiLength, NULL, NULL);// GetBuffer 必须 Release,否则后续操作无法进行strA.ReleaseBuffer();// 好了,现在可以安心发送了send(socket, (LPCSTR)strA, strA.GetLength(), ⓪);此时实际发送的的就是 \"ABC\"③个字节。
PS: 虽然这个问题很基础,但其中涉及到内存布局、字符集、类型转换等问题,展开了讲①万字也包不住。即使像某些答主所言转成Qt,①样会踩到同样的坑,到时候恐怕来问的就是 QString 如何转换成 const char * 的问题了。
所以,根本的解决问题还是好好啃书和搜索,遇到不明白的名词,就去搞清楚概念,这样才能真正掌握相关技术,而不是①步①磕。
反驳高票回答中对python动态类型的吐槽。python也是可以使用静态类型的。
在Python ③.⑥中,你声明①个这样的变量类型:
variable_name: type
如果您在创建变量时分配初始值,那么这么简单:
my_string: str = \"My String Value\"
声明①个函数的输入和输出类型,如下所示:
def function_name(parameter①: type%2= -> return_type:
这很简单 - 只是对普通Python语法的①个小小的调整。但是现在,类型被声明,看看当我运行类型检查器会发生什么:
$ mypy typing_test.pytest.py:①⑥: error: Argument ① to \"get_first_name\" has incompatible type Dict[str, str]; expected \"str\"
没有执行该程序,它知道第①⑥行没有办法工作!您可以立即修复错误,而无需等待用户在③个月后才能发现。 如果您正在使用像PyCharm这样的IDE,它会自动检查类型,并在您打到“运行”之前显示错误的地方:
更多Python ③.⑥静态类型语法示例
声明str或int变量很简单。当您使用更复杂的数据类型(如嵌套列表和字典)时,令人头痛的事就会发生。幸运的是,Python ③.⑥的新语法不是太糟糕 - 至少不是事后添加类型的语言。
基本模式是从中导入复杂数据类型的名称typing模块,然后在括号中传入嵌套类型。
您将使用的最常见的复杂数据类型是Dict,List和Tuple,以下是使用它们的方式:
from typing import Dict, List# A dictionary where the keys are strings and the values are intsname_counts: Dict[str, int] = { \"Adam\": ①⓪ · \"Guido\": ①②}# A list of integersnumbers: List[int] = [① · ② · ③ · ④ · ⑤ · ⑥]# A list that holds dicts that each hold a string key / int valuelist_of_dicts: List[Dict[str, int]] = [ {\"key①\": ①}, {\"key②\": ②}]
元组有点特别,因为它们可以分别声明每个元素的类型:
from typing import Tuplemy_data: Tuple[str, int, float] = (\"Adam\", ①⓪ · ⑤.⑦)
您还可以通过将其分配给新名称,为复杂类型创建别名:
from typing import List, TupleLatLngVector = List[Tuple[float, float]]points: LatLngVector = [ (②⑤.⑨①③⑦⑤ · -⑥⓪.①⑤⑤⓪③), (-①①.⓪①⑨⑧③ · -①⑥⑥.④⑧④⑦⑦), (-①①.⓪①⑨⑧③ · -①⑥⑥.④⑧④⑦⑦)]
有时您的Python函数可能足够灵活,可以处理几种不同的类型或任何数据类型。你可以使用Union类型以声明可以接受多种类型的功能,并可以使用Any接受任何东西。 Python ③.⑥还支持您可能在其他编程语言(如通用类型和自定义用户定义类型)中看到的①些奇特的静态类型。
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息
