在GCC中,您可以通过获取标签的地址(如在)中然后跳转到它()来使用计算的goto.在GCC手册说,你可以从任何地方在功能跳转到这个地址,它只是跳转到它从另一个功能是不确定的.void *addr = &&labeljump *addr
当你跳转到代码时,它不能假设任何关于寄存器值的东西,所以可能它会从内存中重新加载它们.但是,堆栈指针的值也不一定定义,例如,您可能从声明额外变量的嵌套范围跳转.
问题是GCC如何设置将堆栈指针的值设置为正确的值(可能太高或太低)?-fomit-frame-pointer它是如何与之相互作用的(如果有的话)?
最后,对于额外的点,你可以从哪里跳到标签的真正限制是什么?例如,您可以从中断处理程序执行此操作.
我正在使用一个basic_string<wchar_t>类型,需要将其转换为jstring以通过JNI层.我想知道最好的办法是什么.我有一个功能,可以给我一个std::string我的basic_string<wchar_t>类型,所以答案也很酷.
干杯.
你好每一个我想问我已经读过我们只能通过使用指针和使用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
我使用以下代码创建一个文件:
#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++类进行建模.由于每个类应该能够自动处理每个字段,因此一个自然的解决方案就是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++编程了,我决定在业余时间把它搞砸一下,所以我决定给我写一个小数据库程序只是为了好玩,我在创建时遇到了麻烦一组模板化的类对象.
我所拥有的是这个类,我想用它来表示数据库记录中的字段.
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因为这是一个模板化类对象的数组,每个元素可能是不同的类型,我不知道我是否需要声明数组因此.我正在努力做甚至可能,还是我错误的方式?任何帮助将不胜感激.
当我做这样的事情时:
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++开发人员总是知道他们正在处理的数组的界限,似乎很多世界的问题都将得到解决.
的printf和scanf的函数用C家庭消耗对应于所述基本数据类型原始格式说明了一把- %d对int,%llu对unsigned long long int等
但是,有许多标准类型的别名,人们希望在实践中使用,例如int32fast_t,一个人不能也不应该知道底层的基本类型.对于别名stdint.h,C标准谢天谢地指定了一组宏来生成相应的格式字符串,例如PRI32in inttypes.h.
Posix有一组类似的宏吗?POSIX拥有吨不透明的类型,如ssize_t,pid_t,rlim_t,suseconds_t,等等,这些都对基本intgral类型的所有变化.如何在格式字符串中可移植地使用这些类型?
看看C++ 11标准.我可以看到专业化std::tuple_size和std::tuple_element提供volatile和const 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不提供专业化volatile或const 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元组但我无法访问它们的元素.
这是预期的行为还是疏忽?
非常感谢.
[免责声明:我知道这个问题的答案.我认为这可能有一些普遍的兴趣.]
问题:我们怎样才能有一个类型特征产生由执行默认参数促销产生的类型?
动机:我希望能够可移植地使用变量参数.例如:
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)
这该怎么做?
当参数类型不能作为变量参数传递时,产生静态断言的特征的加值点.