新的C++ 11标准提到了一个标题<cuchar>,可能与C99类似<uchar.h>.
现在,我们知道C++ 11带来了专门为UTF16和UTF32设计的新字符类型和文字,但我不认为该语言实际上会包含将(系统相关的)窄多字节编码转换为其中一个的函数. Unicode编码.但是,我刚刚遇到了<cuchar>提及函数mbrtoc16/ c16rtombr和mbrtoc32/ 的头文件概要c32rtombr.
不幸的是,标准没有提到标题概要之外的那些功能.这些功能在哪里定义,他们真正做了什么,在哪里可以阅读更多关于它们的内容?这是否意味着现在可以使用标准C++完全使用适当的Unicode,而无需任何额外的库?
我知道这个问题,但它似乎对我不起作用.
对于设置,采用一个简单的C++程序,hw.cpp由下式给出:int main() { }
在g++ -o hw hw.cpp -O0 -gLinux上编译时,运行ldd ./hw给出:
linux-gate.so.1 => (0x003e5000)
libstdc++.so.6 => /usr/local/lib/libstdc++.so.6 (0x007c5000)
libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x006a4000)
libgcc_s.so.1 => /usr/local/lib/libgcc_s.so.1 (0x00a40000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00a93000)
/lib/ld-linux.so.2 (0x00a0f000)
Run Code Online (Sandbox Code Playgroud)
现在我似乎也有调试库/usr/lib/debug/lib/tls/i686/cmov/,我想这是系统库的相应调试版本.
问:我如何编译我的程序,使其对调试连接建立标准的C和/或C++库,libc/ libm/ libstdc++,共享或静态的?对于共享构建,我希望输出ldd ./hw指向调试目录.
(背景:我的项目使用的一个共享库被Valgrind报告为泄漏("仍然可以访问"),但起源不在共享库本身,而是在dlopen类型代码中(参见此处).所以我我想如果我可以逐步完成_Start()CRT中的调用,我可以追查罪魁祸首.)
更新/更正:我认为我只是非常非常愚蠢 - 调试库可能始终按需要链接.我对调试器在步进时没有显示任何内容感到困惑,这是因为我没有库的源代码.
更新II:好的,保留以前的更新.我现在有了库源代码,但是虽然标准库带有调试符号,但我似乎没有单独的调试版本.这样的构建是否可用,我将如何链接它?
哪个C标准版本作为C++ 14的基础?
C++ 11基于C99,在C11之前几个月发布.C++ 14会基于C11吗?在目前的草案仍然(如2013年12月的),似乎在说"基于ISO/IEC 9899:1999",即C99,我听到那个反复C++ 14是"接近完成",只有在这一点上进行小的调整.在新标准进入投票之前,是否可以修改对C的依赖?
我试图std::swap从[C++ 11:utility.swap]中了解条件.模板定义为
template <typename T> void swap(T &, T &)
Run Code Online (Sandbox Code Playgroud)
(加上一些noexcept细节)并具有"交换存储在两个位置的值"的效果.
以下程序是否有明确定义?
#include <utility>
int main()
{
int m, n;
std::swap(m, n);
}
Run Code Online (Sandbox Code Playgroud)
如果我自己编写交换代码(即int tmp = m; m = n; n = tmp;),它将具有未定义的行为,因为它将尝试对未初始化的对象进行左值到右值的转换.但标准std::swap函数似乎没有任何强加于它的条件,也不能从规范中得出有任何左值到右值并因此有UB.
标准是否需要std::swap执行一些在未初始化对象上明确定义的魔法?
为了澄清这一点,请考虑函数void f(int & n) { n = 25; },该函数从未具有未定义的行为(因为它不读取n).
c++ undefined-behavior language-lawyer lvalue-to-rvalue c++11
我试图在android studio(ndk r10d)中编译一个使用一些C++代码的android应用程序.我需要C++ 11所以我添加-std=gnu++11(我需要gnu++11而不是c++11我正在使用的扩展).我正在使用stlport stl,因为我正在使用的其他库使用这个stl库.所以我在build.gradle文件中的cFlags和stl参数如下所示:
stl "stlport_static"
cFlags " mylib1.a mylib2.a ... -fexceptions -frtti -std=gnu++11"
Run Code Online (Sandbox Code Playgroud)
我也包含了内存: #include <memory>
在尝试编译时,我收到此错误:
'shared_ptr' in namespace 'std' does not name a type
Run Code Online (Sandbox Code Playgroud)
到目前为止,我一直在使用智能指针的boost实现,但随着转向c ++ 11,我宁愿使用标准实现.
Rust在相当高级的情况下执行类型推断.有人可以解释(或指向)描述可以和不可推断的内容的规则吗?
第一个很简单:绑定的类型是绑定表达式的类型:
let n = 10u32;
// Same as:
// vvvvv
let n: u32 = 10u32;
Run Code Online (Sandbox Code Playgroud)
下一个对我来说更令人惊讶:右边的泛型参数是从左边的绑定类型中推导出来的:
let n: u32 = "10".parse().unwrap();
// same as: vvvvvvv
let n: u32 = "10".parse::<u32>().unwrap();
Run Code Online (Sandbox Code Playgroud)
这也适用于泛型类型的"成员函数":
let b = Box::new(10u32);
// same as:
// vvvvv vvvvvvv
let b: Box<u32> = Box::<u32>::new(10u32);
Run Code Online (Sandbox Code Playgroud)
但最奇怪的是跨语句的类型推断:
let v = Vec::new(); // no type!
v.push(10u32); // apparently v is Vec<u32>?!
// v.push(10i32); // type error
Run Code Online (Sandbox Code Playgroud)
类型推断和类型推导的规则是什么?
我最近与一些朋友讨论了"现代"语言与C++相比的优点,当时出现以下内容(我认为受Java启发):
是否有任何C++编译器优化了循环中的动态调度?如果没有,是否存在任何允许作者强制(或强烈鼓励)这种优化的结构?
这是一个例子.假设我有一个多态层次结构:
struct A { virtual int f() { return 0; } };
struct B : A { virtual int f() { return /* something complicated */; } /*...*/ };
Run Code Online (Sandbox Code Playgroud)
现在我有一个累积的循环f():
int acc(const A * p, unsigned int N)
{
int result = 0;
for (unsigned int i = 0; i != N; ++i)
result += p->f(); // #1
return result;
}
Run Code Online (Sandbox Code Playgroud)
在此函数中,动态调度p->f()似乎发生在循环的每一轮中.然而,公然发送(?)的最终目标不能改变.
问题:编译器是否优化了此动态调度?如果没有,有没有办法重写代码来强制进行优化,或者至少让编译器识别出来?有没有好的测试代码可以告诉我这是否已经优化了?
我对语言和实现答案感兴趣,例如"根据标准这是不可能的",或者"是的,MSVC使用选项/xyzzy".
一些比较性评论:显然,Java会在适当的情况下优化甚至内联内部循环中的调用.Objective-C++显然允许您查询动态函数指针并存储它.
澄清:我感兴趣的主要用例是基类和带循环的函数(如累加器)是单独的翻译单元或库的一部分,并且没有对派生类的控制或知识.
假设远程SVN存储库具有以下结构:
/project
/src
/bulk
Run Code Online (Sandbox Code Playgroud)
现在由于某种原因,我已经bulk在我的机器上的其他地方有一个(假定不变或很少改变)的副本.我可以以某种方式签出存储库的新副本,但预先提供该bulk目录,以便不再次下载?
为了澄清,这个假设的过程当然应该检查bulk目录中文件的校验和,并更新那些不正确的文件,这样我最终将有一个完整,一致的结账.我只是想快速下载那些我已经逐字逐句的文件.
出于这样或那样的原因,我想手动滚动归零版本malloc().为了最大限度地减少算法的复杂性,我想写:
void * my_calloc(size_t size)
{
return memset(malloc(size), 0, size);
}
Run Code Online (Sandbox Code Playgroud)
这个定义明确size == 0吗?可以malloc()使用零大小调用,但这允许它返回空指针.请问后续调用memset是否正常,或者这是未定义的行为,我需要添加一个条件if (size)?
我非常想避免多余的条件检查!
假设malloc()暂时没有失败.实际上那里也会有一个手动滚动版本malloc(),它会在失败时终止.
像这样的东西:
void * my_malloc(size_t size)
{
void * const p = malloc(size);
if (p || 0 == size) return p;
terminate();
}
Run Code Online (Sandbox Code Playgroud)
这可能是一个愚蠢的问题,但有人可以请为C++ 11和C11提供标准参考:
是char默认升为int?
这里有一点背景:C和C++都有默认参数提升的概念(C++ 11:5.2.2/7; C11:6.5.2.2/6).这需要在以下调用中提升参数:
void f(int, ...);
float a = 1; short int b = 2; char c = 'x';
f(0, a, b, c);
Run Code Online (Sandbox Code Playgroud)
对于函数调用,a将转换为double并b转换为int.但是会发生什么c?我一直都认为这char也得到提升int,但我无法在标准中找到相关的陈述.