也许我是傻瓜,但我不明白这段代码的问题是什么.我开始怀疑我的工具了.我正在使用Clang(C++ 11)及其libc ++.如果这是我的错,我道歉并提前感谢谁指出我的愚蠢,但如果不是,也许这是一个更深层次的问题..
std::map<int, bool> map_;
map_.insert(std::make_pair<int, bool>(5, true)); //Use a literal, compiles OK
int x = 5;
map_.insert(std::make_pair<int, bool>(x, true)); //Use a local of same type, compile error: 'no known conversion from 'int' to 'int &&' for 1st argument'
Run Code Online (Sandbox Code Playgroud) 我正在开发一个项目,我们有几个可共享多个目标文件的可执行文件.我们希望将日志记录添加到所有可执行文件中,并且有一个库可以执行此操作.
但是,转到main()每个可执行文件的功能并添加相同的样板函数调用以启动日志记录似乎很笨拙.这意味着我们再次写同样的东西,并且在可维护性和DRY("不要重复自己")上松了一口气.如果我们能够系统地确保在调用main函数之前开始记录,那将是很好的.
我发现在libc ++中有一些函数可以调用main,也可以覆盖它们.但是,我不知道它们是什么,并想象如果我们不小心,这可能会破坏它们.有谁知道如何做到这一点?或者,如果这太过分了,还有其他关于如何进行的建议吗?
如果它有任何区别,我们正在使用带有g ++ 4.8的C++ 11.
在32位平台上的libc ++中,int64_t被定义为别名long long.在64位平台上:long.
另一方面,在std::chrono::duration别名的定义中,您可以在这里 long long不经意地使用:
typedef duration<long long, nano> nanoseconds;
typedef duration<long long, micro> microseconds;
typedef duration<long long, milli> milliseconds;
typedef duration<long long > seconds;
typedef duration< long, ratio< 60> > minutes;
typedef duration< long, ratio<3600> > hours;
Run Code Online (Sandbox Code Playgroud)
因此,例如,当我需要严格8字节长的类型时,我会期望
foo(uint64_t);
foo(int64_t);
Run Code Online (Sandbox Code Playgroud)
是一个相当便携的解决方案.但是在libc ++的情况下,chrono它不是真的.除了编写类似于你自己的逻辑之外,没有可移植的方法<cstdint>.即,定义的两个额外的定义,foo称取long long和unsigned long long.
或者另一个例子:
foo(int8_t);
foo(int16_t);
foo(int32_t);
foo(int64_t);
Run Code Online (Sandbox Code Playgroud)
foo(duration.count())在这种情况下,呼叫将是模棱两可的.
那么什么用的点long long是不大于long但它的等级大于 …
在libc ++中,std :: chrono :: microseconds定义为
std::chrono::duration<long long, std::micro>
Run Code Online (Sandbox Code Playgroud)
对于64位平台,long long的定义导致与int64_t的冲突,因为之前已为int64_t定义了代码。
在gnustl中,以前的std :: chrono :: microseconds是用in64_t类型定义的。
我想将微秒的现有定义覆盖为gnustl版本,例如:
typedef std::chrono::duration<int64_t, std::ratio<1, 1000000>> std::chrono::microseconds;
or
#define std::chrono::microseconds std::chrono::duration<int64_t, std::ratio<1, 1000000>>;
Run Code Online (Sandbox Code Playgroud)
我如何达到相同的目的。Typdef和#define在具有std ::和chrono ::的同时给出语法错误,这是我们希望重新定义std :: chrono :: microseconds吗?
在检查libc ++代码时,我看到ndk分配器__allocate函数正在调用__builtin_operator_new,但是我在libc ++代码中找不到它的定义。
顾名思义,它是内存分配功能。但是谁来实现呢?它是由clang,gcc等编译器定义的吗?在哪里可以找到它的定义?
标准库(C 或 C++)实现是否存在任何技术原因(IMO 滥用),强调它们的做法(= 用两个下划线作为所有内容的前缀 + 添加尾部下划线以表示变量是成员变量)?
我明白了/.*__.*/并且 /_[A-Z].*/(<= regexes) 是由实现保留的。但这不是应该指编译器的实现而不是(标准)库吗?
标准库在选择内部名称方面不能像其他库一样吗?