我一直都这么问,但我从来没有得到过一个非常好的答案; 我认为,在写第一个"Hello World"之前,几乎所有程序员都遇到过"宏不应该使用宏","宏是邪恶的"这样的短语等等,我的问题是:为什么?有了新的C++ 11,这么多年后还有一个真正的选择吗?
简单的部分是关于宏#pragma,特定于平台和特定于编译器,并且大多数时候它们具有严重的缺陷,例如#pragma once在至少两种重要情况下容易出错:不同路径中的相同名称以及一些网络设置和文件系统.
但总的来说,宏的用法和替代品呢?
我想对"非正常数据"以及它的内容有一个广泛的看法,因为我认为我唯一正确的事情是从程序员的角度来看与浮点值特别相关的事实,它与一般事项有关 -从CPU角度看计算方法.
有人可以为我解密这2个字吗?
编辑
请记住,我是面向C++应用程序而且只面向C++语言.
我试图调整一些代码并将内容从矢量移动到另一个使用 emplace_back()
#include <iostream>
#include <vector>
struct obj
{
std::string name;
obj():name("NO_NAME"){}
obj(const std::string& _name):name(_name){}
obj(obj&& tmp): name(std::move(tmp.name)) {}
obj& operator=(obj&& tmp) = default;
};
int main(int argc, char* argv[])
{
std::vector<obj> v;
for( int i = 0; i < 1000; ++i )
{
v.emplace_back(obj("Jon"));
}
std::vector<obj> p;
for( int i = 0; i < 1000; ++i )
{
p.emplace_back(v[i]);
}
return(0);
}
Run Code Online (Sandbox Code Playgroud)
这段代码不能用g ++ - 4.7,g ++ - 4.6和clang ++编译:它有什么问题吗?
我总是遇到1个主要错误
调用obj的隐式删除的复制构造函数
?
在Ubuntu 64位下,我得到了
llc --version
LLVM (http://llvm.org/):
LLVM version 3.1
Optimized build with assertions.
Built Oct 15 2012 (18:15:59).
Default target: x86_64-pc-linux-gnu
Host CPU: btver1
Registered Targets:
arm - ARM
mips - Mips
mips64 - Mips64 [experimental]
mips64el - Mips64el [experimental]
mipsel - Mipsel
thumb - Thumb
x86 - 32-bit X86: Pentium-Pro and above
x86-64 - 64-bit X86: EM64T and AMD64
Run Code Online (Sandbox Code Playgroud)
我不能这样做
clang -march=arm -x c++ /tmp/cpp.cpp
error: unknown target CPU 'arm'
Run Code Online (Sandbox Code Playgroud)
我在这里错过了一些东西?为什么我无法为ARM编译?
上次我检查过,说你在ANSI C编码等于说"这是符合C99标准的代码而没有别的东西".现在有了C11和C++ 11,这种区别仍然存在吗?它还有某种含义吗?
经过大量的搜索和一些尝试和失败后,我总结了一些事情,这就是结果:
boost::thread做boost::thread 可以被认为是Posix线程库的包装器,或者如果你愿意的话,它可以被认为是实际上没有关于线程库的真正选择,它们实际上并没有那么不同,它们更像是前一个的演化. .现在我问,如果是这种情况,我应该从哪里开始?
例如,本书明确面向C++ 11标准线程库,它为您提供了基础知识,但是您可能永远不会在现实生活中使用它,因为C++ 11线程支持仍然不是很好.最受欢迎的编译器,它在功能方面确实很差.
我认为可以说从boost::thread今天的世界开始是一个很好的选择 - 如果我错了就纠正我 - 这也是多平台支持和C++ 03遗留支持的唯一真正选择:我的问题是我真的找不到一本关于并发和多线程的书或参考文章看起来恰到好处,或者它只是足够好boost:thread.
你能推荐一本以并发为主的书boost::thread吗?
我试图弄清楚这个代码如何在普通的C++中没有任何依赖性,所以我使用moc编译器,但显然我错了.
moc总是返回
main.cpp:0: Note: No relevant classes found. No output generated.
Run Code Online (Sandbox Code Playgroud)
代码是
Run Code Online (Sandbox Code Playgroud)#include <QApplication> #include <QWidget> #include <QPushButton> class MyButton : public QWidget { public: MyButton(QWidget *parent = 0); }; MyButton::MyButton(QWidget *parent) : QWidget(parent) { QPushButton *quit = new QPushButton("Quit", this); quit->setGeometry(50, 40, 75, 30); connect(quit, SIGNAL(clicked()), qApp, SLOT(quit())); } int main(int argc, char *argv[]) { QApplication app(argc, argv); MyButton window; window.resize(250, 150); window.move(300, 300); window.setWindowTitle("button"); window.show(); return app.exec(); }
总的来说,我有兴趣使用C++标准库创建我自己的信号槽系统(没有增强信号,没有QT,没有别的)所以我这样做是出于研究目的,我只对基础设施感兴趣关于信号和插槽.
谢谢.
假设我编写了一个标准算法的实现,例如MD*或SHA*:我怎么知道它是正确的?同一算法的不同实现必须产生相同的摘要?
我认为工会可以完美地满足我的想法,特别是当我认为我的代码应该运行在一个非常异构的机器系列上,特别是低功耗的机器时,困扰我的是创建编译器的人这一事实对于引入和提供良好的工会支持似乎并不太在意,例如,当谈到Unrestricted Unions支持时,这个表是空洞的,这对我的项目来说是一个真正令人不快的看法.
有替代品union可以至少模仿相同的属性吗?
我找不到任何关于如何在C++中编写和读取非ASCII文件的参考.
我想创建我的文件格式,同时表达文件内部信息的精确模式和标记,但基本上fstream我只能创建文本文件.文本模式或二进制模式对于此目的并不重要,结果始终是ASCII文件.
如何逐个字节地编写文件,就像你不能简单地用文本编辑器解析它们并且它们有自己的定义?
c++ ×10
c++11 ×3
c ×2
ansi-c ×1
architecture ×1
arm ×1
boost-thread ×1
clang ×1
coding-style ×1
concurrency ×1
cpu ×1
cryptography ×1
file-io ×1
format ×1
hardware ×1
hash ×1
llvm ×1
pthreads ×1
qt ×1
signals ×1
standards ×1
unions ×1
unit-testing ×1
vector ×1