我知道restrictC中的限定符指定两个指针指向的内存区域不应重叠。据我了解,Linux(不是 SUS)原型看起来memcpy像 -
void* memcpy(void *restrict dest, const void *restrict src, size_t count);
Run Code Online (Sandbox Code Playgroud)
然而,当我查看man7.org/memcpy时,声明似乎是 -
void *memcpy(void dest[restrict .n], const void src[restrict .n], size_t n);
Run Code Online (Sandbox Code Playgroud)
我的问题是 -
.前面的是什么n意思?我熟悉可变长度数组声明。变量的 for是否.出现在数组指定之后?这是标准的一部分吗?根据C标准,整数类型的值表示是实现定义的.因此,5可能不会像32位2的补码那样表示00000000000000000000000000000101或-1正如11111111111111111111111111111111我们通常所假设的那样.因此,即使运营商~,<<并且>>是有严格规定的位模式,他们将合作上实现定义.我能找到的唯一定义的位模式是"§5.2.1/ 3所有位都设置为0的字节,称为空字符,应存在于基本执行字符集中;它用于终止字符串." .
所以我的问题是 - 是否有一种实现独立的方式将整数类型转换为位模式?
我们总是可以从一个空字符开始,并对它进行足够的位操作以使其达到所需的值,但我发现它太麻烦了.我也意识到几乎所有实现都将使用2的补码表示,但我想知道如何以纯C标准方式进行.我个人认为这个主题非常有趣,因为设备驱动程序编程的问题是所有直到日期编写的代码都采用特定的实现方式.
我最近遇到了yieldPython中的关键字(以及JavaScript) - 我知道这主要用于生成器模式,但语言结构似乎也用于异步函数以及我的兴趣所在.在异步函数中,它可能只是作为合成糖,我知道有其他模式可以达到相同的效果 - 但我喜欢它 - 很多!
我想知道我是否可以在C中做类似的事情(即使使用内联汇编).我遇到了一个使用线程https://github.com/mherrmann/java-generator-functions的Java实现,我可以或多或少地在C中实现.但这不是一个独立的实现,我的兴趣纯粹是在独立实施.
来到C协同程序(http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html),其中一个缺点是无法使用堆栈对象.但是我仍然可以使用它,因为当前的异步回调实现也不能使用堆栈.然而问题在于独立实现 - 我想不出一种方法来收集所有寄存器变量并在没有托管环境的情况下存储它们.
可能有一个使用的解决方案setjmp/longjmp,但我很确定这些不能独立实现.
所以问题是:是否有可能在独立 C中实现Python yield功能?
我个人认为我已经筋疲力尽了,所以我会问这个问题 - 如果你有一个托管实现,你会如何实现它(最好带一些宏观魔法)?我有一个相当丑陋的实现,如果没有什么很酷的话,我稍后会发布.
此外,我不想要C++实现 - 除非您可以使用纯C函数包装C++.
编辑:基本要求是生成器功能必须重新进入.
我发现C标准(C99和C11)在字符/字符串代码位置和编码规则方面含糊不清:
首先,标准定义the source character set和the execution character set.本质上它提供了一组字形,但不会将任何数值与它们相关联 - 那么什么是默认字符集?
我不是在这里询问编码,而只是字形/曲目到数字/代码点映射.它确实定义universal character names为ISO/IEC 10646,但它是否说这是默认的字符集?
作为上述的扩展 - 我找不到任何说明数字转义序列\ 0和\ x代表什么字符的内容.
从C标准(C99和C11,我没有检查ANSI C)我得到了关于字符和字符串文字的以下内容:
+---------+-----+------------+----------------------------------------------+
| Literal | Std | Type | Meaning |
+---------+-----+------------+----------------------------------------------+
| '...' | C99 | int | An integer character constant is a sequence |
| | | | of one or more multibyte characters |
| L'...' | C99 | wchar_t | A wide character constant is a sequence of | …Run Code Online (Sandbox Code Playgroud) 我理解JTAG曾经被用作边界扫描器(非常简洁的解释,请访问http://www.fpga4fun.com/JTAG1.html).但是,我无法看到如今将JTAG用作硬件级调试器(有点类似于在线仿真器).
1.有人可以解释JTAG如何用作硬件级调试器吗?
我的假设是片上必须有一些额外的硬件,这有助于调试,而JTAG只是驱动硬件获取调试信息.如果我的理解是正确的 -
2A.什么是硬件?
2B.它有标准吗?
我很怀疑标准部分,因为我看到的基于JTAG的硬件级调试器的所有实现都各不相同.
最后,将JTAG称为硬件级调试器确实令人困惑,而JTAG标准没有定义任何类型.那么JTAG用于此时会有不同的名称吗?
我正在尝试开发类似远程桌面/ VNC客户端的东西.我有必要捕获客户端窗口中的所有事件.我正在使用的processEvent方法是覆盖以下方法JFrame:
@Override
protected void processEvent(AWTEvent e) {
...
}
Run Code Online (Sandbox Code Playgroud)
但是,在Windows键或Alt+Tab窗口等事件被取消激活时:
...
00000191 KEY_PRESSED,keyCode=524,keyText=Windows,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_LEFT,rawCode=91,primaryLevelUnicode=0,scancode=91,extendedKeyCode=0x20c
00000192 KEY_RELEASED,keyCode=524,keyText=Windows,keyChar=Undefined keyChar,keyLocation=KEY_LOCATION_LEFT,rawCode=91,primaryLevelUnicode=0,scancode=91,extendedKeyCode=0x20c
000000ce WINDOW_DEACTIVATED,opposite=null,oldState=0,newState=0
...
Run Code Online (Sandbox Code Playgroud)
如何让窗口保持活动状态?
我更喜欢纯Java解决方案.如果没有纯Java解决方案,有人可以指向我的JNA解决方案(或任何其他解决方案)?
EDIT1: *解决了窗口停用的模糊术语"焦点"*强调非纯Java解决方案是可以接受的
我有一个C++程序,其中new运算符过载.问题是,如果我在new运算符中的分配失败,我仍然在调用构造函数.我知道我可以通过投掷避免这种情况std::bad_alloc,但我不想这样做.
如何在重载的new运算符中失败并仍然不调用我的构造函数?基本上我想实现类似的东西new (std::nothrow).
这是一个例子来说明我的意思.请注意,我正在测试的系统没有内存保护.所以访问NULL不会做任何事情
示例1:重载的新运算符
#include <stdio.h>
#include <stdlib.h>
#include <memory>
class Test {
public:
Test(void) {
printf("Test constructor\n");
}
void print(void) {
printf("this: %p\n", this);
}
void* operator new(size_t size, unsigned int extra) {
void* ptr = malloc(size + extra);
ptr = NULL; // For testing purposes
if (ptr == NULL) {
// ?
}
return ptr;
}
};
int main(void) {
Test* t = new …Run Code Online (Sandbox Code Playgroud) 考虑一下场景:
class Base { };
class Derived: public virtual Base {};
int main(void) {
Derived * d = new Derived();
Base * b = d;
Derived * x = static_cast<Derived*>(b); // Probably impossible
delete x;
}
Run Code Online (Sandbox Code Playgroud)
这里从指向Base到指向Derived的指针的向下转换给出了一个编译错误,说"由于base是虚拟的,因此无法转换".我不能动态转换,因为Base不是多态类型.我的问题是:
如果不可能,我想了解原因.我知道虚拟方法是通过vptr表实现的,但是如何实现虚拟基类?我也知道C++标准没有定义实现,但我想了解像gcc这样常见的东西的实现.所以问题是:
对于那里的所有C++专家来说,这可能是一个相当简单的问题,但是在google-ing半小时之后我找不到具体的东西.如果已经涵盖,请随意复制,投票等.
这是我大致想要实现的目标:
// 声明
模板<类型名称...参数>
结构ArgsEstimate;
// 字符串的专门化,SFINAE 就有点过分了
模板<类型名称...参数>
struct ArgsEstimate<std::string&, Args...> {
静态常量 std::size_t 大小 = 64 + ArgsEstimate<Args...>::size;
};
// 算术类型的特化
模板<类型名称 AirthmeticT,
类型名 std::enable_if<std::is_arithmetic<AirthmeticT>::value>::type* = nullptr,
类型名称...参数>
struct ArgsEstimate<AirthmeticT, Args...> {
static const std::size_t size = sizeof(AirthmeticT) + ArgsEstimate<Args...>::size;
};
// 指针类型的特化
模板<类型名 PtrT,
类型名 std::enable_if<std::is_pointer<PtrT>::value>::type* = nullptr,
类型名称...参数>
struct ArgsEstimate<PtrT, Args...> {
静态常量 std::size_t 大小 = 32 + ArgsEstimate<Args...>::size;
};
问题是,这段代码在我所做的点上给出了编译错误“模板参数在部分专业化中不可推导”enable_if。结构内部的Astatic_assert也不起作用,因为将会重新定义。
我知道,我可以单独使用 SFINAE 和函数重载来做到这一点。然而,对于像这样的情况std::string,使用 SFINAE 就有点矫枉过正了。
所以我想知道是否有混合模板专业化和 SFINAE 的干净方法。