初始化在另一个共享库中声明的静态对象的规则是什么?例如,请考虑以下事项:
文件X.hpp:
struct X {
X ();
static X const s_x;
};
struct Y {
Y (X const &) {}
};
Run Code Online (Sandbox Code Playgroud)
文件X.cpp:
#include "X.hpp"
#include <iostream>
X::X ()
{
std::cout << "side effect";
}
X const X::s_x;
Run Code Online (Sandbox Code Playgroud)
我在静态库中编译了X.cpp libX.a,并尝试将以下可执行文件链接到它(文件main.cpp):
#include "X.hpp"
int main ()
{
(void)X::s_x; // (1)
X x = s_x; // (2)
Y y = s_x; // (3)
}
Run Code Online (Sandbox Code Playgroud)
只有(1)或(2),没有任何反应.但是如果我添加(3),则初始化静态对象(即打印"副作用").(我使用gcc 4.6.1).
有没有办法预测这里会发生什么?
我不明白指令(2)如何不强制X::s_x对象是默认构造的,而(3)则不然.
编辑:构建命令:
g++ -c X.cpp
g++ -c main.cpp
ar rcs libX.a X.o
g++ …Run Code Online (Sandbox Code Playgroud) 这个问题来自这个问题:
但由于OP接受了答案,我想现在没人会读.
我在g ++上尝试了这段代码.看来,当传递给这个函数时,数组不会衰减到指针(该函数返回正确的结果):
#include <iostream>
template <typename T>
std::size_t size_of_array (T const & array)
{
return sizeof (array) / sizeof (*array);
}
int main ()
{
int a [5];
std::cout << size_of_array (a) << '\n';
}
Run Code Online (Sandbox Code Playgroud)
另一个用户(sharptooth)表示他在VC++ 10上具有相同的行为内联.
有人可以解释一下吗?谢谢.
有没有办法让lpSolve返回多个解决方案?在下面的情况下,我想要(5,0)和(0,5)两者.
如果lpSolve无法做到这一点,那么是否有任何其他R包将返回整体线性优化程序的所有可能解决方案?
library("lpSolve")
A=matrix (c(1, 1), nrow=1, byrow=TRUE)
b=(5)
signs='=='
c_=c(1,1)
res = lpSolve::lp('max', c_, A, signs, b, all.int = TRUE)
res$solution
Run Code Online (Sandbox Code Playgroud)
================================================== =====================
我还想知道为什么lpSolve包提供了所有可能的解决方案,如果所有决策变量都是二进制的.当所有变量都是整数时,为什么不能重复相同的...
我想知道free()指针是否可以转换为另一种类型.例如,如果我这样做:
char *p = malloc (sizeof (int));
int *q = (int *)p;
free (q);
Run Code Online (Sandbox Code Playgroud)
我没有收到关于gcc(-Wall)的警告.
在linux上,free上的手册页说,在malloc(),calloc()或realloc()没有返回的指针上调用free是违法的.但是如果指针被转换为中间的另一种类型会发生什么?
我问这个是因为我读到C标准不要求不同的指针类型(例如int*和char*)具有相同的大小,我不明白这是如何可能的,因为它们都需要可转换为void*为了调用malloc/free函数.
以上代码是否合法?
我想做这样的事情:
union U {
int i;
double d;
};
void foo (double *d) { *d = 3.4; }
int main ()
{
union U u;
foo (&(u.d));
}
Run Code Online (Sandbox Code Playgroud)
gcc不抱怨(和-Wall -Wextra)并且它按预期工作,但我想确保它实际上是合法的(根据标准).