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

发表时间:2017-12-19 06:00:02 作者: 来源: 浏览:

在上一篇文章中,小编为您详细介绍了关于《你有多恨 Java?java的就业前景如何》相关知识。本篇中小编将再为您讲解标题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 ③.⑥还支持您可能在其他编程语言(如通用类型和自定义用户定义类型)中看到的①些奇特的静态类型。

编后语:关于《mfc中CString如何转化为const char*类型?为什么样像 Java、C、C++ 这样的静态语言会比 Python、Ruby 这样的动态语言流行得多》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《尼康发布的Df咋样?你的第一部拍摄设备是什么样》,感兴趣的同学可以点击进去看看。

资源转载网络,如有侵权联系删除。

相关资讯推荐

相关应用推荐

玩家点评

条评论

热门下载

  • 手机网游
  • 手机软件

热点资讯

  • 最新话题