这是一个概述我的问题的最小例子
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)
我的程序无法编译的任何想法?
我想知道一个实现是否std::variant必须"平坦"或是否允许为其成员动态分配内存,这样一系列变体会退化为一系列指针,从而破坏缓存局部性.
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是旧的,但是允许省略声明和默认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) 我对本地范围内的任何对象的默认行为是 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&&. 即使对象的生命周期已接近尾声。我们不能从我们承诺不会改变的东西中窃取资源。但这会削弱常量正确性。
那么,我怎样才能拥有我的蛋糕并吃掉它呢?
(即我怎样才能拥有常量正确性并从移动语义中受益。)
考虑这个最小的例子:
#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) 发布:tabnew somefile将somefile在当前选项卡右侧的新选项卡中打开.我可以以某种方式让Vim打开当前标签左侧的标签吗?
更新:建议的答案允许我打开一个新的选项卡,但他们打破文件名自动完成,这是一个禁忌.
我正在调用strdup,必须在调用之前为变量分配空间strdup.
char *variable;
variable = (char*) malloc(sizeof(char*));
variable = strdup(word);
Run Code Online (Sandbox Code Playgroud)
我这样做了吗?或者这里有什么问题吗?
我有一个SVG"g"对象,它有几个组件.我想让整个事情部分透明(例如alpha = 0.5)我也希望尽可能地变暗.我知道可以调整各个填充颜色,但是所有这些颜色可以一起调整,可能在"g"(分组)结构的某些参数中.
C99标准以6.5.2美元计价.
在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算来修改一次.此外,先前的值应该只读以确定要存储的值.
(我强调)
它继续指出,以下示例是有效的(一开始看起来很明显)
a[i] = i;
Run Code Online (Sandbox Code Playgroud)
虽然它没有明确说明是什么a和i是什么.
虽然我相信它没有,但我想知道这个例子是否涵盖以下情况:
int i = 0, *a = &i;
a[i] = i;
Run Code Online (Sandbox Code Playgroud)
这不会改变值i,而是访问值i来确定放置值的地址.或者我们分配一个i已存储的值是无关紧要的i?请说清楚.
奖金问题; 怎么样a[i]++还是a[i] = 1?