我已经在C和C#中编程了很长时间,我觉得转向C++会很顺利......
无论如何,我看过使用插入符号,但我不明白它的含义.
有什么不同:
std::string *st1;
Run Code Online (Sandbox Code Playgroud)
至
String::string ^st2;
Run Code Online (Sandbox Code Playgroud)
谢谢!
现代C和C++编译器支持非标准的#pragma once
预处理器指令,它与经典的头部保护器具有类似的用途:
#ifndef hopefully_unique_identifier_that_doesnt_hurt_the_code
#define hopefully_unique_identifier_that_doesnt_hurt_the_code
// some code here
#endif
Run Code Online (Sandbox Code Playgroud)
一个问题,我知道,使用经典的方法是,一旦你包含一个标题,你必须#undef
使用标题保护宏再次包含它(这样做,对我来说,是一个主要的代码气味,但那是除此之外).该方法也出现了同样的问题#pragma once
,但没有允许多次包含标题的可能性.
经典方法的另一个问题是,您可能会意外地在不相关的位置定义相同的宏,因此要么不包括预期的标题,要么做一些其他令人讨厌的东西,这是我无法想象的.这在实践中相当容易避免,通过遵守某些约定,例如将宏基于类似UUID的对象(即随机字符串)或(不太理想的方法),基于文件的名称,它们在.
在现实生活中,我很少遇到任何这些潜在问题,所以我并不认为它们是主要问题.
我能想到的唯一潜在的现实生活问题#pragma once
是,它不是一个标准的东西 - 你依赖的东西可能无处不在,即使它存在,在实践中,无处不在(*).
那么,#pragma once
除了我已经提到过的问题之外,还有哪些潜在的问题?我是否过于相信在实践中,无处不在?
(*)只有少数人使用的一些次要编译器,被排除在外.
我有一个简单的项目,它使用SWIG使一个小型 C++ 库可用于 C#。C++ 部分是单一源代码和单一头文件——此外还有一个 SWIG 接口文件。SWIG 的输出包含 5 个 C# 源文件和 1 个 C++ 源文件。
这样做make
相当简单,但我在理解 bazel 时遇到了一些问题。
我如何告诉 bazel 这 6 个文件都是使用同一个命令生成的?另外,当我这样做时,我该如何告诉 bazel 实际调用该命令。
我最终感兴趣的最终产品是一个 .net dll 文件,它仅依赖于接口文件和原始 C++ 头文件。
作为一个支持 unicode 的 C++ 开发人员,温和地说,是一件很痛苦的事情。Unicode 有一些不幸的属性,使得确定字母的大小写、转换字母或识别单个已知代码点等(可能是也可能不是字母)之外的几乎任何事情都变得非常困难。对于那些不幸没有内置 Unicode 支持的语言(即 C 和 C++)的人来说,唯一真正的救援似乎是ICU 。对其他语言的 unicode 支持可能不够好,也可能不够好。
所以,我想,一定有一个真正的unicode 替代品!即,除了具有查找数据结构(树、表等)并识别字符之间的关系之外,还可以轻松识别字符类的编码?我怀疑对于大多数文本来说,任何此类编码都可能是多字节的——这对我来说并不是真正关心的问题,但我承认这对其他人来说也是如此。提供这样的编码需要大量工作,因此我并不真正期望存在任何这样的编码。
我执行的语言,有两家运营商之间的冲突| * |
和* || *
-第一个是"规范"操作,其中两个|
-characters环绕的表达,另一个是运营商还是,其中两个表达式三明治2个|
-characters.
到目前为止,我能够解析类似的表达式||| a || b | | |
- 即单个或三个级别的规范或(规范中任意数量的规范和任何系列的或运算符); 这只适用于表达式的尾部包含|
彼此之间有空格的字符 - 即||| a || b | | |
可以工作,但||| a || b |||
会导致语法错误.我希望能够将最后一个版本解析为a or b
内部的三个规范.
我的实现的简约版本(即相关部分):
野牛/ Yacc部分:
%token NUM
%token OR
%token NORM
%right LOR ROR
%right NORM
%right OR
%right '|'
%%
expression:
NUM
| lnorm expression rnorm %prec NORM
| expression LOR ROR expression %prec OR …
Run Code Online (Sandbox Code Playgroud) 在开发新产品的过程中,我们决定采用C++和C#的混合方式,但有人告诉他们将它们联系起来以允许C#代码调用C++代码很容易(更糟糕的是,它不是).
我们是非常有经验的C++程序员,而不是所有C#程序员,因此我们几乎不得不相信我们所读过的内容.一些调用C和Objective-C的尝试很有希望,我们甚至发现了一些文章,展示了如何在C#中提供非托管C++类 - 或者至少我们认为.文章中的C++代码不是C++,而是微软似乎认为可怕的怪物C++/CLI是C++.由于我们正在做C#的东西,以便在macOS和Windows中"免费"获取一些内容,因此C++/CLI也不是一个选项:-(.
无论如何,很多人都声称从一些特定的编程语言中调用C++代码很容易,但到目前为止,我还没有看到一个允许我这样做的单一代码(我没有过多关注这个,请给我一个明显的例子).C++总是意味着C完全没有C++的东西; 没有名称空间,类,没有stl,lambdas或任何东西.只是简单的愚蠢C.
那么,还有没有任何语言,除了C++(/ CLI),因此将允许我做到以下几点:
使用C++构造函数创建类的实例,并使用C++析构函数调度它.
foo f; f.foo();
使用C++类在object()上调用成员函数.
使用std::vector
,std::find_if
,std::string
和STL的其他的东西.不需要完全覆盖stl.
使用重载函数(即f()
,f(int)
,f(std::string)
)
使用重载运算符(foo operator + (foo, foo)
)
使用C++ 11,C++ 14和/或C++ 17功能.
使用RAII(相当重要的恕我直言).
使用名称空间.
在C(以及许多其他"低级"语言)中,函数具有类型.您可以使用与函数匹配的类型声明变量,并可以为此类变量分配函数,但人们坚持认为函数不是C中的一等公民.
使用指向函数的指针并将函数作为参数传递给其他函数是C中几个标准函数的关键; qsort
例如,要求传递比较函数或者它不能做任何事情.
通过struct
使用函数类型声明多个变量,在C中看到"面向对象"编程并不罕见.回调可以并且通常是(如果不总是 - 我无法想象其他任何方式)使用带有函数类型的变量或struct
带有函数类型的成员的s实现.
那么,为什么函数不被认为是C中的一等公民呢?
(我确定这是重复的,但我似乎无法在这里找到任何类似的问题)
我有一个关于从未使用过的类中的事件的警告。该类将接口实现为空对象,因此它永远不应该使用该事件;该事件仅存在于实现接口。
我尝试按照这个问题中接受的答案进行操作,但它没有做任何事情。该活动是公开的,我正在使用 Visual Studio 2017 和 Visual Studio for Mac(又名 Xamarin,又名 Monodevelop + 扩展),以防万一。
我正在使用 bazel 在 Windows 和 Mac 上构建一些 C++ 和 C# 清晰的代码。我正在做的项目分为两部分;gui 部分(取决于平台)和库部分。该库与其他项目共享,因此将它们混合到一个大项目中可能不是一个好主意。
我必须使用 genrule 来构建 GUI,但我找不到让它下载库的方法。genrules 不允许deps
,我找不到任何其他合适的方法让 bazel 做我需要的事情(除了混合部分,这是我真正不想做的)。