6

为什么我无法将我的代码编译为 c++ 11 并使用 srand48 函数?

我有一个程序,我在其中玩一些矩阵。问题是当我用-std=c++0x标志编译代码时。我想使用一些仅限 c++11 的函数,这是我这样做的方法。如果我不指定 c++ 版本,它编译没有任何问题。像这样:

g++ -O2 -Wall test.cpp -o test -g

如果我误解了上述标志的作用,请纠正我。

我在 Windows 7 64 位机器上运行我的代码并通过 cygwin 编译。我使用 g++ 版本 4.5.3 (GCC)。如果需要更多信息,请发表评论。

由于某种未知的原因(甚至对我自己而言),我的所有代码都写在一个编译单元中。如果错误是由结构错误引起的,那么您也应该随时指出。:)

我收到以下错误

g++ -std=c++0x -O2 -Wall test.cpp -o test -g

test.cpp: In function ‘void gen_mat(T*, size_t)’:
test.cpp:28:16: error: there are no arguments to ‘srand48’ that depend on a template parameter, so a declaration of ‘srand48’ must be available
test.cpp:28:16: note: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated)
test.cpp:33:28: error: there are no arguments to ‘drand48’ that depend on a template parameter, so a declaration of ‘drand48’ must be available

这是我的代码的一个子部分,它会生成上面显示的错误。

#include <iostream>
#include <cstdlib>
#include <cassert>
#include <cstring>
#include <limits.h>
#include <math.h>

#define RANGE(S) (S)

// Precision for checking identity.
#define PRECISION 1e-10

using namespace std;

template <typename T> 
void gen_mat(T *a, size_t dim)
{
    srand48(dim);
    for(size_t i = 0; i < dim; ++i)
    {
        for(size_t j = 0; j < dim; ++j)
        {
            T z = (drand48() - 0.5)*RANGE(dim);
            a[i*dim+j] = (z < 10*PRECISION && z > -10*PRECISION) ? 0.0 : z;
        }
    }
}

int main(int argc, char *argv[])
{

}

问候金。

这是为我解决问题的解决方案

首先 nm 解释了 srand() 在编译时不能使用-std=c++0x. 但是,要使用的正确标志是-std=gnu++11它需要 g++ 版本 4.7+ 因此,我的解决方案是使用编译命令编译我的代码-std=gnu++0x =g++ -O2 -Wall test.cpp -o test -g -std=gnu++0x

4

1 回答 1

6

如果您明确设置-stc=c++03,您将得到相同的错误。这是因为drand48和朋友实际上并不是任何 C++ 标准的一部分。gcc将这些功能作为扩展包含在内,并在请求标准行为时禁用它们。

的默认标准模式g++实际上是-std=gnu++03. 您可能想要使用-std=gnu++11而不是-std=c++0x,或传递 -U__STRICT_ANSI__给编译器。

于 2013-05-16T09:04:04.670 回答