我是一名C++程序员,多年来一直听到STL 不适合在嵌入式环境中使用的概念,因此通常禁止在嵌入式环境项目中使用.我相信像Boost这样的STL库功能更强大,并提供一个更快,更容易出错的开发手段(当然语法有点吓人,但一旦过去,我认为这是一个真正的宝藏).而且,我发现STL很重要并且增加代码荒谬的最终足迹的说法因为它是模板化的,只会获得他要求的可编译代码,而不是整个STL.
我的问题是这个民粹主义者的原因是什么(至少我认为是这样的大多数人都这么认为)这个概念称STL 不适用于嵌入式环境?
我确实看到了类似性质的问题,但在此我希望能帮助指出STL和嵌入式环境的一般优缺点.
编辑:所以在这里我将按照回复的
说法将点数加起来:
1.可移植性问题
2.通过STL容器处理巨大的dymanice分配
3. STL很难调试
4. STL中的深层函数调用导致编译器性能低下内联弱(函子的力量无用!)
有什么东西可以在C中完成但在C++中没有,在C++编码时你最想念的是哪些?
我能想到的几件事情:
编辑:感谢@sbi指出:
1.应该是:我们可以为C中的任何类型的指针分配void指针,但不能在C++中
以下简单的程序片段给出了编译错误gcc-4.3.4.
程序:
int main()
{
char *ptr = new char[10];
char *ptr1 = new char[];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译错误:
prog.cpp:在函数'int main()'中:
prog.cpp:4:错误:在']'之前预期的primary-expression
prog.cpp:3:警告:未使用的变量'
ptr'prog.cpp:4:warning :未使用的变量'ptr1'
但是同样的编译与MSVC完全没有任何诊断消息.
所以我的问题是:
标准是否允许在new []不指定的情况下调用size?或者这是MSVC中的一个错误?
有人可以提供标准的参考,最终会说上面的代码示例是格式错误还是格式正确?
我看过:
5.3.4 New [expr.new]&
18.4.1.2数组形式[lib.new.delete.array]
但无法找到有关该行为的任何确凿证据.
编辑:
添加Language Lawyer标签.
我期待观察到的行为的答案,无论它是否有用,我完全清楚它没有用处,也没有推荐.
我在linux平台上开发.
我想在我的库中创建一个新进程而不替换当前正在执行的图像.
因为我正在开发一个库,所以我没有主要功能.
我想在调用程序应用程序关闭后继续新进程(就像CreateProcess Windows API一样).
是否可以在Linux中使用?
像这样的功能:
void Linux_CreateProcess(const char* app_name)
{
// Executing app_name.
// ???????? what is the code ??????
// app_name is running and never close if current application close.
return;
}
Run Code Online (Sandbox Code Playgroud)
注意:
system()阻止当前进程,这并不好.我想继续当前的流程.
exec()系列替换当前正在执行的图像,这并不好.
如果当前进程关闭,popen()将关闭新进程.
我想要一些关于互斥和信号量的澄清.
我的问题是,
我基本上有两个问题可能是相关的,所以我将它们合二为一.
我们应该在传递给函数时通过引用或值传递C++ 11中的枚举类.它继承了原始类型,但它是通过的整个对象吗?因为枚举类是安全的;
enum class MyEnumClass : unsigned short {
Flag1 = 0,
Flag2 = 1,
Flag3 = 2,
Flag4 = 4,
};
Run Code Online (Sandbox Code Playgroud)
现在让我们说我们有功能sig
const char* findVal(const MyEnumClass& enumClass);
^
should this be by const ref? __|
Run Code Online (Sandbox Code Playgroud)
我的另一个问题是 -
SHOULD IT BE BY MOVE like (MyEnumClass&&) - I am still learning/understanding
move semantics and rvalue so I am not sure if move semantics are only for
constructors or can be for member or static funcs -
Run Code Online (Sandbox Code Playgroud) 最近,我已经看到很多关于输出的问题,一些疯狂但语法上允许的代码语句就像是i = ++i + 1和i=(i,i++,i)+1;.实际上坦率地说,几乎没有人在实际编程中编写任何这样的代码.坦率地说,我从未在我的专业经验中遇到任何这样的代码.所以我通常最终会在SO上跳过这些问题.但是最近这种问题的绝对数量让我想到如果我错过了一些重要的理论,就是跳过这样的问题.我认为这样的Q围绕着Sequence points.我几乎不知道序列点是坦率的,我只是想知道如果不知道它在某种程度上是一个障碍.那么有人可以解释一下理论/概念Sequence points,或者如果可能的话,指向解释该概念的资源.此外,是否值得花时间了解这个概念/理论?
是否可以有2个具有相同名称但不同参数的宏?像这样的东西:
#define FI(value) do {l<<value; Doit(l); } while(0)
#define FI(value, level) do {l<<value ; Doit(l,level); } while(0)
Run Code Online (Sandbox Code Playgroud) Cppcheck为scanf显示以下警告:
Message: scanf without field width limits can crash with huge input data. To fix this error message add a field width specifier:
%s => %20s
%i => %3i
Sample program that can crash:
#include
int main()
{
int a;
scanf("%i", &a);
return 0;
}
To make it crash:
perl -e 'print "5"x2100000' | ./a.out
我无法崩溃这个程序输入"巨大的输入数据".我应该输入什么才能让这次崩溃?我也不明白这个警告中最后一行的含义:
perl -e ...
在他富有洞察力的论文"
错误和异常处理"中,
@ Dave Abrahams说:
如果可能的话,让你的异常类免受双重破坏.不幸的是,一些流行的编译器偶尔会导致异常对象被销毁两次.如果你可以安排它是无害的(例如通过清零已删除的指针),你的代码将更加健壮.
我无法理解这个特定的指导方针,有人可以: