小编Mik*_*eMB的帖子

为什么g ++仍然需要-latomic

29.5原型类型的C++标准2014年11月的工作草案中,它指出:

  1. 有一个泛型类模板atomic.模板参数T的类型应该是可以轻易复制的(3.9).[注意:不能静态初始化的类型参数可能难以使用. - 尾注]

所以 - 据我所知 - 这:

#include <atomic>

struct Message {
    unsigned long int a;
    unsigned long int b;
};

std::atomic<Message> sharedState;

int main() {    
    Message tmp{1,2};       
    sharedState.store(tmp);         
    Message tmp2=sharedState.load();
}
Run Code Online (Sandbox Code Playgroud)

应该是完全有效的标准c ++ 14(以及c ++ 11)代码.但是,如果我没有libatomic手动链接,那么命令

g++ -std=c++14 <filename>
Run Code Online (Sandbox Code Playgroud)

给出 - 至少在Fedora 22(gcc 5.1)上 - 以下链接错误:

/tmp/ccdiWWQi.o: In function `std::atomic<Message>::store(Message, std::memory_order)':
main.cpp:(.text._ZNSt6atomicI7MessageE5storeES0_St12memory_order[_ZNSt6atomicI7MessageE5storeES0_St12memory_order]+0x3f): undefined reference to `__atomic_store_16'
/tmp/ccdiWWQi.o: In function `std::atomic<Message>::load(std::memory_order) const':
main.cpp:(.text._ZNKSt6atomicI7MessageE4loadESt12memory_order[_ZNKSt6atomicI7MessageE4loadESt12memory_order]+0x1c): undefined reference to `__atomic_load_16'
collect2: error: ld returned 1 exit status …
Run Code Online (Sandbox Code Playgroud)

c++ g++ libstdc++ c++11 stdatomic

12
推荐指数
1
解决办法
3658
查看次数

c ++异常的行为逃逸到c程序中

假设我有一个用c ++实现的共享库,但是暴露了一个纯c接口.然后该库用于ac程序.

如果异常从c ++库转移到c应用程序中,gcc是否会对发生的情况做出任何保证?
它会不会总是终止程序?

我主要对Linux on x64和ARMv7-R上的gcc答案感兴趣,但也欢迎其他操作系统,编译器和架构的答案.

编辑:
只是为了明确这一点:我不是在讨论让异常通过c函数然后被调用c ++函数或与c或c ++回调交互.应用程序代码本身就是纯粹的c.在某些时候,它将调用共享库的一个函数(内部是纯c ++),并且在该函数返回之前不会调用任何应用程序代码.另外,我们假设我无法控制用于编译应用程序代码的标志.

c c++ gcc exception

11
推荐指数
1
解决办法
393
查看次数

在VS2013中查看两个git修订版之间的差异

在VS2013中使用git进行源代码控制时,有没有办法在集成编辑器中显示源文件的两个任意版本之间的差异(具有内置功能或免费扩展/插件)?

到目前为止,我只发现了如何显示自上次提交或从一次提交到下一次提交所做的更改.

如果它有任何区别:我主要用于c ++.

git diff visual-studio visual-studio-2013

10
推荐指数
2
解决办法
3938
查看次数

move是否指定std :: fstream关闭原始流

从c ++ 11开始,我们可以将一个std::fstream对象移动到另一个对象,但是我找不到文档说明,如果fstream对象已经与文件(is_open()==true)相关联会发生什么.

所以我的问题是,在下面的代码中,是否File1.txt会正确关闭或者是否必须手动关闭它.如果我必须手动完成,如果我不这样做会怎么样?

std::fstream file("File1.txt");   
file = std::fstream("File2.txt"); //will this implicitly call file.close()?             
Run Code Online (Sandbox Code Playgroud)

c++ move filestream

10
推荐指数
1
解决办法
469
查看次数

cmake 中组件和命名空间的命名约定

简而言之:

cmake 库目标是否有任何首选命名约定 - 特别是在使用命名空间时?

笔记:

除非真的有客观原因,否则我不是在问个人喜好,而是是否有“官方”(例如套件推荐)或已建立(可能偏离)的惯例。

细节:

假设我有一个库/框架foo,其中包含单独的组件barbaz. 到目前为止,我的命名约定是这样的:

add_library(foo-bar src1.cpp, scr2.cpp)
add_library(foo-baz src3.cpp, src4.cpp)
Run Code Online (Sandbox Code Playgroud)

现在我想使用命名空间 ( ::) 约定添加别名目标。例如

add_library(Foo::Bar ALIAS foo-bar)
add_library(Foo::Baz ALIAS foo-baz)
Run Code Online (Sandbox Code Playgroud)

(当然,这个问题也延伸到导出集,但我不想让问题复杂化)
然而,我无法真正发现的是,这些目标是否有首选甚至官方的命名约定。

我见过的东西:

  • 命名空间部分:
    • 有些项目似乎大写第一个字母,有些不是(前者似乎更常见)
  • 组成部分:
    • 在某些项目中,组件名称与二进制名称相同
    • 有或没有“lib”前缀(libfoo-bar vs foo-bar)
    • 有或没有命名空间(foo-bar vs bar)
    • 有些项目将第一个字母大写
    • 一些项目使用 CamelCase some snake_case,即使二进制文件或项目名称不遵循这些约定。

我想主要问题是一般没有库的命名约定,因此很难在 CMake 中提出命名约定,但至少命名空间和组件的第一个字母的大写字母似乎很漂亮很常见,所以我想知道是否有一些指导方针我应该在未来的项目中遵循。

naming-conventions cmake

9
推荐指数
1
解决办法
9866
查看次数

std :: uint8_t的底层类型

问题:
是否存在任何c ++工具链,std::uint8_t不是unsigned char(或者char,如果它是无符号的)的typedef ?

编辑:相反:在符合标准的实施中,这样的事情是否可能?

背景/动机:
我主要是因为我想知道是否std::uint8_t*可以移植来访问单个字节(就像unsigned char*).是的,我知道std::byte,但这不相关.我主要对x86,arm和mips的工具链感兴趣,但出于好奇,我也想听听其他的例子.

c++ standard-library

8
推荐指数
1
解决办法
404
查看次数

clang和gcc中的Constexpr复合赋值运算符

我有以下代码:

main.cpp中

#include <cstdint>
#include <type_traits>

enum class FooEnum : uint8_t{
    Foo1 = 0, 
    Foo2 = 1
};

constexpr uint32_t& operator|= (uint32_t& lhs, FooEnum rhs) {
    return lhs |= 1u << static_cast<uint8_t>(rhs);
}

int main() {
    uint32_t bar{0};
    bar|=FooEnum::Foo1;
}
Run Code Online (Sandbox Code Playgroud)

基本上,|=运算符应该采用枚举并设置位,其位置对应于其整数值.

在fedora 21上用clang ++ 3.5.0编译时,一切正常,但是当用g ++ 4.9.2编译时,它会抛出一个错误,说这不是一个常量表达式:

main.cpp: In function ‘constexpr uint32_t& operator|=(uint32_t&, FooEnum)’:
main.cpp:16:2: error: expression ‘(lhs = (lhs | (1u << ((int)rhs))))’ is not a constant-expression
  }
  ^
Run Code Online (Sandbox Code Playgroud)

对于所有类型的编译器标志组合都是如此,但是你可以测试它g++ -std=c++11 -o …

c++ language-lawyer constexpr c++11 c++14

7
推荐指数
1
解决办法
1156
查看次数

列表初始化中多个模板化构造函数的重载规则

我不确定以下代码是否符合c ++ 11标准,并且应该在不同的实现中具有相同的行为:

#include <cstddef>
struct Foo{
    template <std::size_t N>
    constexpr Foo( const char ( &other )[N] )       
    {}

    template <class T>
    constexpr Foo( const  T* const& other ) = delete;
};

struct Bar {
    Foo a;
    int b;
};

int main() {
    Bar bar{ "Hello",5};
}
Run Code Online (Sandbox Code Playgroud)

一般的想法是允许构造一个字符串文字和一个std::string(这里没有显示),但不是指针const char,这有点棘手(在这个问题中讨论).

较新版本的g ++(> = 6.0)和几乎所有clang ++版本(> = 3.4)似乎编译得很好,但是例如 g++-4.8 -std=c++11 main.cpp我得到以下错误:

main.cpp: In function ‘int main()’:
main.cpp:17:27: error: use of deleted function ‘constexpr Foo::Foo(const T* …
Run Code Online (Sandbox Code Playgroud)

c++ templates overloading deleted-functions c++11

7
推荐指数
1
解决办法
153
查看次数

替换 std::tuple 的第 N 个元素

用一个值(可能有也可能没有不同的类型)替换元组的第 n 个元素的最短/最佳方法是什么?包括 c++20 在内的解决方案很好。[编辑:我更喜欢不需要其他库的东西,但我仍然对使用例如 boost 可能的解决方案感兴趣]。

IE:

#include <cassert>
#include <tuple>

template<std::size_t N, ... >
auto replace_tuple_element( ... ) // <- Looking for a suitable implementation

struct Foo {
    int value;
};

int main()
{
    auto t1  = std::tuple{ 0, 1, 2, 3 };
    auto t2 = replace_tuple_element<2>( t1, Foo{10} );

    assert( std::get<0>(t2) == std::get<0>(t1));
    assert( std::get<1>(t2) == std::get<1>(t1));
    assert( std::get<2>(t2).value == 10);
    assert( std::get<3>(t2) == std::get<3>(t1));
}
Run Code Online (Sandbox Code Playgroud)

注意:仅替换类型列表中的第 n 个类型已经在这里讨论过:如何在编译时替换元组元素?. 但我也想替换这个值,并希望现在在 c++20 中有比问这个问题时更简单/更优雅的解决方案。

c++ c++20

7
推荐指数
1
解决办法
195
查看次数

Visual Studio 自动为函数名称添加括号

VS2015(对于 C++)中是否有选项或(免费)扩展,以便当 Intellisense 自动完成函数名称(在调用站点)时,它还会添加左括号和右括号并将光标设置在它们之间?

c++ intellisense autocomplete visual-studio

6
推荐指数
1
解决办法
2196
查看次数