小编bit*_*ask的帖子

gcc不会正确包含math.h

这是一个概述我的问题的最小例子

test.c的:

#include <stdio.h>
#include <math.h>

main ()
{
   fmod ( 3, 2 );
}
Run Code Online (Sandbox Code Playgroud)

这是我要编译的命令 test.c

gcc -lm test.c -o test
Run Code Online (Sandbox Code Playgroud)

这是我发出上述命令时得到的输出

/tmp/ccQmRk99.o: In function `main':
test.c:(.text+0x3e): undefined reference to `fmod'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

如果相反,我会使用相同的输出cc.我使用的是以下版本的gcc

gcc-4.6.real (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
Run Code Online (Sandbox Code Playgroud)

我的程序无法编译的任何想法?

c linker gcc static-libraries

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

是否允许std :: variant为其成员分配内存?

我想知道一个实现是否std::variant必须"平坦"或是否允许为其成员动态分配内存,这样一系列变体会退化为一系列指针,从而破坏缓存局部性.

c++ variant dynamic-memory-allocation c++17

19
推荐指数
2
解决办法
1300
查看次数

由于私有继承而无法访问的类型

g++拒绝让我访问某种类型,只是因为它恰好是一个私人的祖父.这有意义吗?

struct A {};

struct B : private A {};

struct C : B {
  void foo(A const& a) {}
};
Run Code Online (Sandbox Code Playgroud)

编译这会产生:

1:10: error: ‘struct A A::A’ is inaccessible
6:12: error: within this context
Run Code Online (Sandbox Code Playgroud)

我的观点是:我从不想A作为祖先访问.事实上,如果A是一个私人祖先B,不应该对任何人完全不可见,但B(即C)?

当然,我可以使用protected继承,但在我的情况下,它并没有真正意义.

c++ inheritance private

14
推荐指数
2
解决办法
668
查看次数

为什么/ C允许隐式函数和无类型变量声明?

为什么语言允许隐式声明函数和无类型变量?我知道C是旧的,但是允许省略声明和默认int()(或者int在变量的情况下)对我来说似乎并不那么理智,即便在那时.

那么,为什么它最初被引入?它真的有用吗?它实际上(仍然)使用过吗?

注意:我意识到现代编译器会给你警告(取决于你传递它们的标志),你可以抑制这个功能.那不是问题!


例:

int main() {
  static bar = 7; // defaults to "int bar"
  return foo(bar); // defaults to a "int foo()"
}

int foo(int i) {
  return i;
}
Run Code Online (Sandbox Code Playgroud)

c history language-design implicit-declaration

14
推荐指数
4
解决办法
2829
查看次数

我应该让我的局部变量是常量还是可移动?

我对本地范围内的任何对象的默认行为是 make it const。例如:

auto const cake = bake_cake(arguments);
Run Code Online (Sandbox Code Playgroud)

我尽量减少非功能性代码,因为这会增加可读性(并为编译器提供一些优化机会)。所以在类型系统中也反映这一点是合乎逻辑的。

然而,使用移动语义,这会产生问题:如果我cake很难或不可能复制并且我想在完成后将其传递出去怎么办?例如:

if (tastes_fine(cake)) {
  return serve_dish(cake);
}
Run Code Online (Sandbox Code Playgroud)

据我了解复制cake省略规则,不能保证副本会被删除(但我不确定这一点)。

所以,我不得不搬出cake去:

return serve_dish(std::move(cake)); // this will not work as intended
Run Code Online (Sandbox Code Playgroud)

但这std::move不会有任何用处,因为它(正确地)不会转换Cake const&Cake&&. 即使对象的生命周期已接近尾声。我们不能从我们承诺不会改变的东西中窃取资源。但这会削弱常量正确性。

那么,我怎样才能拥有我的蛋糕并吃掉它呢?

(即我怎样才能拥有常量正确性并从移动语义中受益。)

c++ const-correctness move-semantics c++17

14
推荐指数
1
解决办法
450
查看次数

从隐式转换中复制构造shared_ptr有什么问题?

考虑这个最小的例子:

#include <memory>

struct B {
  typedef std::shared_ptr<B> Ptr;
};

struct A {
  operator B::Ptr() { // type conversion operator                  <----+
    return std::make_shared<B>();  //                                   |
  }                                //                                   |
};                                 //                                   |
                                   //                                   |
int main() {                       //                                   |
  A* a = new A;                    //                                   |
  B::Ptr{*a}; // copy construction from a's implicit cast to B::Ptr ----+ 
}
Run Code Online (Sandbox Code Playgroud)

的这个无辜的拷贝构造shared_ptr<B> 失败,可怕的G ++ 4.6.3 x86_64的Linux的GNU的,但似乎对工作的g ++ 4.5(请注意,新版本休息,而老的作品!).从我从错误中可以看出来(见下文),g ++ 4.6似乎A通过值而不是(r或l)引用.

那么,问题是,哪个是正确的,哪个是坏的?这种行为应该失败吗?如果是这样,为什么?
据我了解转换规则,此时B::Ptr 应该尝试隐式转换,对吧?


注意:我将此示例简化为技术问题,并且此代码对于任何生产系统都没有意义.

这是精确的错误:

shp.cpp: …
Run Code Online (Sandbox Code Playgroud)

c++ compiler-errors g++ type-conversion c++11

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

我可以打开当前标签左侧的新标签吗?

发布:tabnew somefilesomefile在当前选项卡右侧的新选项卡中打开.我可以以某种方式让Vim打开当前标签左侧的标签吗?

更新:建议的答案允许我打开一个新的选项卡,但他们打破文件名自动完成,这是一个禁忌.

vim customization tabs

12
推荐指数
2
解决办法
1039
查看次数

我如何使用strdup?

我正在调用strdup,必须在调用之前为变量分配空间strdup.

char *variable;
variable = (char*) malloc(sizeof(char*));
variable = strdup(word);
Run Code Online (Sandbox Code Playgroud)

我这样做了吗?或者这里有什么问题吗?

c malloc strdup

12
推荐指数
3
解决办法
4万
查看次数

可以一起调整SVG组的不透明度/半透明度吗?

我有一个SVG"g"对象,它有几个组件.我想让整个事情部分透明(例如alpha = 0.5)我也希望尽可能地变暗.我知道可以调整各个填充颜色,但是所有这些颜色可以一起调整,可能在"g"(分组)结构的某些参数中.

svg transparency

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

表达式的定义行为

C99标准以6.5.2美元计价.

在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算来修改一次.此外,先前的值应该只读以确定要存储的值.

(我强调)

它继续指出,以下示例是有效的(一开始看起来很明显)

a[i] = i;
Run Code Online (Sandbox Code Playgroud)

虽然它没有明确说明是什么ai是什么.

虽然我相信它没有,但我想知道这个例子是否涵盖以下情况:

int i = 0, *a = &i;
a[i] = i;
Run Code Online (Sandbox Code Playgroud)

不会改变值i,而是访问值i来确定放置值的地址.或者我们分配一个i已存储的值是无关紧要的i?请说清楚.


奖金问题; 怎么样a[i]++还是a[i] = 1

c standards-compliance undefined-behavior language-lawyer

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