小编Nic*_*lle的帖子

在链接静态库时初始化静态对象

初始化在另一个共享库中声明的静态对象的规则是什么?例如,请考虑以下事项:

文件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)

c++ ld static-libraries

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

如果在模板函数中通过const引用传递,则数组不会衰减到指针

这个问题来自这个问题:

c ++将数组传递给函数问题

但由于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上具有相同的行为内联.

有人可以解释一下吗?谢谢.

c++ arrays

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

R lpsolve查看完整LP的所有可能解决方案

有没有办法让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包提供了所有可能的解决方案,如果所有决策变量都是二进制的.当所有变量都是整数时,为什么不能重复相同的...

optimization r linear-programming lpsolve

5
推荐指数
1
解决办法
1084
查看次数

释放一个指针

我想知道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函数.

以上代码是否合法?

c

4
推荐指数
1
解决办法
2718
查看次数

在C中取一个工会成员的地址是合法的吗?

我想做这样的事情:

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)并且它按预期工作,但我想确保它实际上是合法的(根据标准).

c unions

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

标签 统计

c ×2

c++ ×2

arrays ×1

ld ×1

linear-programming ×1

lpsolve ×1

optimization ×1

r ×1

static-libraries ×1

unions ×1