小编Ker*_* SB的帖子

GCC计算了堆栈指针的goto和值

在GCC中,您可以通过获取标签的地址(如在)中然后跳转到它()来使用计算的goto.在GCC手册说,你可以从任何地方在功能跳转到这个地址,它只是跳转到它从另一个功能是不确定的.void *addr = &&labeljump *addr

当你跳转到代码时,它不能假设任何关于寄​​存器值的东西,所以可能它会从内存中重新加载它们.但是,堆栈指针的值也不一定定义,例如,您可能从声明额外变量的嵌套范围跳转.

问题是GCC如何设置将堆栈指针的值设置为正确的值(可能太高或太低)?-fomit-frame-pointer它是如何与之相互作用的(如果有的话)?

最后,对于额外的点,你可以从哪里跳到标签的真正限制是什么?例如,您可以从中断处理程序执行此操作.

c stack gcc goto

10
推荐指数
1
解决办法
2636
查看次数

从basic_string转换为jstring

我正在使用一个basic_string<wchar_t>类型,需要将其转换为jstring以通过JNI层.我想知道最好的办法是什么.我有一个功能,可以给我一个std::string我的basic_string<wchar_t>类型,所以答案也很酷.

干杯.

c++ java string java-native-interface

9
推荐指数
1
解决办法
8160
查看次数

我们可以给静态数组的大小一个变量

你好每一个我想问我已经读过我们只能通过使用指针和使用malloc或newlike来声明动态数组

int * array = new int[strlen(argv[2])];
Run Code Online (Sandbox Code Playgroud)

但我写了

int array[strlen(argv[2])];
Run Code Online (Sandbox Code Playgroud)

它没有给我任何错误

我已经读过静态数组只能通过给出常量数组大小来声明,但在这里我给了静态数组一个可变大小

为什么这么谢谢


是否可以安全使用,或者有可能在任何后期阶段它会产生问题我使用gcc linux

c c++

9
推荐指数
2
解决办法
3468
查看次数

open()没有正确设置文件权限

我使用以下代码创建一个文件:

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>

int main()
{
    const char* filename = "./test.out";
    int fd;
    if(-1 == (fd = open(filename, O_CREAT|O_RDWR, 0666)))
    {
        perror("Error");
        errno = 0;
    }       
    else
        puts("File opened");

    if(-1 == (close(fd)))
    {
        perror("Error");
        errno = 0;
    }
    else
        puts("File closed");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我将mode参数指定为0666,应该授予每个人读,写访问权限.然而,一个ls -l节目

-rw-r--r-- 1 kmehta users 0 2012-01-29 16:29 test.out

如您所见,写权限仅授予文件所有者.我不知道为什么其他人都没有被正确授予权限.chmod a+w test.out但是,正确设置权限.

代码编译为 gcc -Wall …

c posix

9
推荐指数
2
解决办法
7822
查看次数

如何设计带有"注释"字段的类?

想象一下,我们有一些具有数百种消息类型的协议,每种消息类型我们都希望通过C++类进行建模.由于每个类应该能够自动处理每个字段,因此一个自然的解决方案就是std::tuple拥有所有必需的类型:

std::tuple<int, double, char> message;

print(message);   // the usual variadic magic
Run Code Online (Sandbox Code Playgroud)

这一切都很好.但是,现在我想给每个字段命名,我希望能够在引用代码中的字段时使用该名称,并获得它的文本表示.天真地,或者在C中,我可能写过:

struct Message
{
    int    header;
    double temperature;
    char   flag;
};
Run Code Online (Sandbox Code Playgroud)

这样我们就失去了元组的递归自动处理能力,但我们可以从字面上命名每个字段.在C++中,我们可以通过枚举来做到这两点:

struct Message
{
    enum FieldID { header, temperature, flag };
    static const char * FieldNames[] = { "header", "temperature", "flag" };

    typedef std::tuple<int, double, char> tuple_type;

    template <FieldID I>
    typename std::tuple_element<I, tuple_type>::type & get()
    { return std::get<I>(data); }

    template <FieldID I>
    static const char * name() { return FieldNames[I]; }

    tuple_type data;
};
Run Code Online (Sandbox Code Playgroud)

现在我可以说Message …

c++ class-design field

9
推荐指数
1
解决办法
1048
查看次数

如何创建模板化类对象的数组?

我已经有很长一段时间没有做过任何C++编程了,我决定在业余时间把它搞砸一下,所以我决定给我写一个小数据库程序只是为了好玩,我在创建时遇到了麻烦一组模板化的类对象.

我所拥有的是这个类,我想用它来表示数据库记录中的字段.

template <class T, int fieldTypeId>
class Field
{
private:
    T field;
    int field_type;
public:
    // ...
};
Run Code Online (Sandbox Code Playgroud)

我想使用该类的数组来表示使用此类的数据库中的记录.

class Database_Record
{
private:
    int id;
    Field record[];
public:
    Database_Record(int);
    Database_Record(int, Field[]);
   ~Database_Record();
};
Run Code Online (Sandbox Code Playgroud)

我坚持的地方是在类中创建数组,Database_Record因为这是一个模板化类对象的数组,每个元素可能是不同的类型,我不知道我是否需要声明数组因此.我正在努力做甚至可能,还是我错误的方式?任何帮助将不胜感激.

c++ arrays templates

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

C++ 11基于范围的for循环如何知道数组大小?

当我做这样的事情时:

int my_array[5] = {1, 2, 3, 4, 5};
for (int &x : my_array) {
    x *= 2;
}
Run Code Online (Sandbox Code Playgroud)

C++ 11显然知道我的数组只有5个元素.这些信息是否存储在my_array对象的某个位置?

如果是这样,有什么理由说明为什么它不能作为开发人员提供给我(或者是它?!?!?)?如果C++开发人员总是知道他们正在处理的数组的界限,似乎很多世界的问题都将得到解决.

c++ for-loop c++11

9
推荐指数
3
解决办法
4745
查看次数

Posix是否为printf/scanf提供格式字符串宏?

printfscanf的函数用C家庭消耗对应于所述基本数据类型原始格式说明了一把- %dint,%lluunsigned long long int

但是,有许多标准类型的别名,人们希望在实践中使用,例如int32fast_t,一个人不能也不应该知道底层的基本类型.对于别名stdint.h,C标准谢天谢地指定了一组宏来生成相应的格式字符串,例如PRI32in inttypes.h.

Posix有一组类似的宏吗?POSIX拥有吨不透明的类型,如ssize_t,pid_t,rlim_t,suseconds_t,等等,这些都对基本intgral类型的所有变化.如何在格式字符串中可移植地使用这些类型?

c c++ printf posix

9
推荐指数
1
解决办法
471
查看次数

volatile和const volatile std :: tuple和std :: get

看看C++ 11标准.我可以看到专业化std::tuple_sizestd::tuple_element提供volatileconst volatile元组.

template <size_t I, class T> class tuple_element<I, volatile T>;
template <size_t I, class T> class tuple_element<I, const volatile T>;

template <class T> class tuple_size<volatile T>;
template <class T> class tuple_size<const volatile T>;
Run Code Online (Sandbox Code Playgroud)

std::get不提供专业化volatileconst volatile元组.

我在GCC.4.8.1上尝试了以下代码

volatile std::tuple<int, int> a(1, 1);
std::cout << "a<0>=" << std::get<0>(a) << "\n";
Run Code Online (Sandbox Code Playgroud)

我收到错误: no matching function for call to 'get(volatile std::tuple<int, int>&)'

所以如果我理解我可以创建(const)volatile元组但我无法访问它们的元素.

这是预期的行为还是疏忽?

非常感谢.

c++ c++11

9
推荐指数
1
解决办法
334
查看次数

输入trait以获取默认参数促销

[免责声明:我知道这个问题的答案.我认为这可能有一些普遍的兴趣.]

问题:我们怎样才能有一个类型特征产生由执行默认参数促销产生的类型?

动机:我希望能够可移植地使用变量参数.例如:

void foo(char const * fmt, ...);  // Please pass: * unsigned short
                                  //              * bool
                                  //              * char32_t
                                  //              * unsigned char
Run Code Online (Sandbox Code Playgroud)

当将参数传递给没有参数的函数调用时,即匹配省略号时,参数会进行默认参数提升.到目前为止一直很好,但这些促销是依赖于平台的.我可以恢复参数va_arg(ap, T),但是什么T

现在,对于一些简单的情况,这很容易:例如,我总是可以说:

unsigned short n = va_args(ap, unsigned int);
Run Code Online (Sandbox Code Playgroud)

默认促销将导致a signed int或an unsigned int,但根据,例如,C11 7.16.1.1/3,va-casting unsigned int总是很好,因为即使默认促销结果为a int,原始值也可以由两者表示类型.

但是当我期待一个类型时,我应该选择什么类型char32_t?C++ 11 4.5/2使得结果类型大开.所以我想要一个让我写的特质:

char32_t c = va_args(ap, default_promote<char32_t>::type);
Run Code Online (Sandbox Code Playgroud)

这该怎么做?

当参数类型不能作为变量参数传递时,产生静态断言的特征的加值点.

c++ variadic-functions type-traits

8
推荐指数
1
解决办法
586
查看次数