什么是一组漂亮的预处理器黑客(ANSI C89/ISO C90兼容),它在C中实现某种丑陋(但可用)的面向对象?
我熟悉一些不同的面向对象语言,所以请不要回答"学习C++!"这样的答案.我读过" 面向对象的ANSI C编程 "(当心:PDF格式)和其他一些有趣的解决方案,但我最感兴趣的是你:-)!
另请参见您能用C编写面向对象的代码吗?
我想了解的区别memcpy()和memmove(),和我读的文本memcpy(),而没有照顾重叠源和目的地memmove()一样.
但是,当我在重叠的内存块上执行这两个函数时,它们都会给出相同的结果.例如,在memmove()帮助页面上采用以下MSDN示例: -
有没有更好的例子来理解它的缺点memcpy和memmove解决方法?
// crt_memcpy.c
// Illustrate overlapping copy: memmove always handles it correctly; memcpy may handle
// it correctly.
#include <memory.h>
#include <string.h>
#include <stdio.h>
char str1[7] = "aabbcc";
int main( void )
{
printf( "The string: %s\n", str1 );
memcpy( str1 + 2, str1, 4 );
printf( "New string: %s\n", str1 );
strcpy_s( str1, sizeof(str1), "aabbcc" ); // reset string
printf( "The string: …Run Code Online (Sandbox Code Playgroud) 我需要在C中使用一个大的空数组作为全局数组.除了输入外,还有什么方法可以做到这一点
char ZEROARRAY[1024] = {0, 0, 0, /* ... 1021 more times... */ };
Run Code Online (Sandbox Code Playgroud)
?
实际上是什么是C运行时库以及它用于什么?我正在搜索,谷歌搜索像魔鬼,但我找不到比微软更好的东西:"微软运行时库提供了Microsoft Windows操作系统编程的例程.这些例程自动执行许多常见的编程任务,这些任务不是由微软提供的. C和C++语言."
好的,我明白了,但是例如,是什么libcmt.lib?它有什么作用?我认为C标准库是C编译器的一部分.那么libcmt.libWindows的C标准库函数的实现是否可以在win32下运行?
在上一学期的系统编程课程中,我们必须在C中实现一个基本的客户端/服务器.初始化结构,比如sock_addr_in,或者char缓冲区(我们用来在客户端和服务器之间来回发送数据)教授指示我们只使用bzero而不是memset初始化它们.他从未解释过为什么,而且我很好奇是否有正当理由呢?
我在这里看到:http://fdiv.net/2009/01/14/memset-vs-bzero-ultimate-showdown这bzero是更有效的,由于一个只能将要归零记忆的事实,所以也没有必须做任何额外的检查memset.尽管如此,这仍然不一定是绝对不能memset用于归零内存的理由.
bzero被认为已弃用,而且不是标准的C函数.根据手册,memset因此优先考虑bzero.所以,你为什么要仍然使用bzero过memset?只是为了提高效率,还是更多?同样,有什么好处memset了bzero,使它成为新的程序的事实上的首选?
我有一个我创建的库,
mylib.c:
#include <mylib.h>
int
testlib() {
printf("Hello world\n");
return (0);
}
Run Code Online (Sandbox Code Playgroud)
mylib.h:
#include <stdio.h>
extern int testlib();
Run Code Online (Sandbox Code Playgroud)
在我的程序中,我试图调用这个库函数:
myprogram.c:
#include <mylib.h>
int
main (int argc, char *argv[]) {
testlib();
return (0);
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译该程序时,我收到以下错误:
In file included from myprogram.c:1 mylib.h:2 warning: function declaration isn't a prototype
我正在使用: gcc (GCC) 3.4.5 20051201 (Red Hat 3.4.5-2)
我的问题是,声明函数原型的正确方法是什么?
我想为Windows平台编写一个截屏程序,但我不确定如何捕获屏幕.我所知道的唯一方法就是使用GDI,但我很好奇是否还有其他方法可以解决这个问题,如果有的话,会产生最少的开销?速度是一个优先事项.
屏幕录像程序将用于录制游戏镜头,但是,如果这确实缩小了选项范围,我仍然可以接受任何其他超出此范围的建议.毕竟知识还不错.
编辑:我遇到过这篇文章:捕获屏幕的各种方法.它向我介绍了Windows Media API的实现方式以及DirectX的实现方式.它在结论中提到,禁用硬件加速可以极大地提高捕获应用程序的性能.我很好奇为什么会这样.任何人都可以为我填补遗失的空白吗?
编辑:我读过像Camtasia这样的截屏程序使用他们自己的捕获驱动程序.有人能给我一个深入的解释它是如何工作的,以及为什么它更快?我可能还需要有关实现类似内容的指导,但我确信无论如何都有现有的文档.
此外,我现在知道FRAPS如何记录屏幕.它挂钩底层图形API以从后台缓冲区读取.根据我的理解,这比从前端缓冲区读取更快,因为您是从系统RAM而不是视频RAM读取的.你可以在这里阅读这篇文章.
我知道C和C++标准留下了语言实现的许多方面 - 仅仅因为如果存在具有其他特征的体系结构,那么为它编写符合标准的编译器是非常困难或不可能的.
我知道40年前任何电脑都有自己独特的规格.但是,我不知道今天使用的任何架构:
CHAR_BIT != 8signed 不是两个补充(我听说Java有这个问题).我问的原因是我经常向人们解释C++不强制要求任何其他低级方面如固定大小的类型†.这很好,因为与其他语言不同,它使你的代码在正确使用时可以移植(编辑:因为它可以移植到更多架构而不需要模拟机器的低级方面,例如符号+幅度架构上的二进制补码算法) .但我感到很难过,我自己也无法指出任何特定的架构.
所以问题是:哪些架构具有上述属性?
† uint*_ts是可选的.
在C中,编译器将按照声明它们的顺序布置结构的成员,在成员之间插入可能的填充字节,或者在最后一个成员之后插入,以确保每个成员正确对齐.
gcc提供了一种语言扩展,__attribute__((packed))它告诉编译器不要插入填充,允许结构成员不对齐.例如,如果系统通常要求所有int对象都具有4字节对齐,则__attribute__((packed))可能导致int在奇数偏移处分配struct成员.
引用gcc文档:
`packed'属性指定变量或结构字段应该具有尽可能小的对齐 - 变量的一个字节和字段的一个位,除非您使用`aligned'属性指定更大的值.
显然,使用此扩展可以导致更小的数据要求但代码更慢,因为编译器必须(在某些平台上)生成代码,以便一次一个字节地访问未对齐的成员.
但有任何不安全的情况吗?编译器是否始终生成正确(但速度较慢)的代码来访问打包结构的未对齐成员?在所有情况下都可以这样做吗?
在C和C++等编程语言中,人们经常提到静态和动态内存分配.我理解这个概念,但短语"所有内存在编译期间被分配(保留)"总是让我感到困惑.
据我所知,编译将高级C/C++代码转换为机器语言并输出可执行文件.如何在编译文件中"分配"内存?是不是内存总是在RAM中分配所有虚拟内存管理的东西?
根据定义,内存分配不是运行时概念吗?
如果我在我的C/C++代码中创建一个1KB静态分配的变量,那么这会增加可执行文件的大小吗?
这是在"静态分配"标题下使用该短语的页面之一.
c ×10
c++ ×3
gcc ×2
architecture ×1
arrays ×1
memcpy ×1
memmove ×1
memory ×1
memset ×1
object ×1
oop ×1
pragma-pack ×1
runtime ×1
terminology ×1
windows ×1