小编Ker*_* SB的帖子

`<cuchar>`提供什么,它在哪里记录?

新的C++ 11标准提到了一个标题<cuchar>,可能与C99类似<uchar.h>.

现在,我们知道C++ 11带来了专门为UTF16和UTF32设计的新字符类型和文字,但我不认为该语言实际上会包含将(系统相关的)窄多字节编码转换为其中一个的函数. Unicode编码.但是,我刚刚遇到了<cuchar>提及函数mbrtoc16/ c16rtombrmbrtoc32/ 的头文件概要c32rtombr.

不幸的是,标准没有提到标题概要之外的那些功能.这些功能在哪里定义,他们真正做了什么,在哪里可以阅读更多关于它们的内容?这是否意味着现在可以使用标准C++完全使用适当的Unicode,而无需任何额外的库?

c++ unicode c++11

16
推荐指数
1
解决办法
1571
查看次数

如何在GCC中链接libc和libstdc ++的调试版本?

我知道这个问题,但它似乎对我不起作用.

对于设置,采用一个简单的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++ debugging gcc

16
推荐指数
1
解决办法
4816
查看次数

C++ 14将以哪个C标准为基础?

哪个C标准版本作为C++ 14的基础?

C++ 11基于C99,在C11之前几个月发布.C++ 14会基于C11吗?在目前的草案仍然(如2013年12月的),似乎在说"基于ISO/IEC 9899:1999",即C99,我听到那个反复C++ 14是"接近完成",只有在这一点上进行小的调整.在新标准进入投票之前,是否可以修改对C的依赖?

c++ standards language-lawyer c++14

16
推荐指数
1
解决办法
549
查看次数

swap()会导致未定义的行为吗?

我试图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

16
推荐指数
2
解决办法
719
查看次数

获取错误:名称空间"std"中的"shared_ptr"未命名类型

我试图在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,我宁愿使用标准实现.

android stlport c++11 android-studio

16
推荐指数
2
解决办法
3万
查看次数

Rust的类型推断如何跨多个语句工作?

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)

类型推断和类型推导的规则是什么?

type-inference rust

16
推荐指数
1
解决办法
1409
查看次数

将动态类型从循环中提升(也称为C++方式的Java)

我最近与一些朋友讨论了"现代"语言与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++显然允许您查询动态函数指针并存储它.

澄清:我感兴趣的主要用例是基类和带循环的函数(如累加器)是单独的翻译单元或库的一部分,并且没有对派生类的控制或知识.

c++ virtual

15
推荐指数
2
解决办法
711
查看次数

跳过SVN结账的目录?(部分结账)

假设远程SVN存储库具有以下结构:

/project
        /src
        /bulk
Run Code Online (Sandbox Code Playgroud)

现在由于某种原因,我已经bulk在我的机器上的其他地方有一个(假定不变或很少改变)的副本.我可以以某种方式签出存储库的新副本,但预先提供该bulk目录,以便不再次下载?

为了澄清,这个假设的过程当然应该检查bulk目录中文件的校验和,并更新那些不正确的文件,这样我最终将有一个完整,一致的结账.我只是想快速下载那些我已经逐字逐句的文件.

svn svn-checkout

15
推荐指数
1
解决办法
2万
查看次数

如果大小为0,可以使用空指针调用memset()吗?

出于这样或那样的原因,我想手动滚动归零版本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 malloc memset

15
推荐指数
3
解决办法
8036
查看次数

char是默认提升的吗?

这可能是一个愚蠢的问题,但有人可以请为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将转换为doubleb转换为int.但是会发生什么c?我一直都认为这char也得到提升int,但我无法在标准中找到相关的陈述.

c c++ integer-promotion language-lawyer

15
推荐指数
2
解决办法
1194
查看次数