Questions tagged «c»

C是用于系统编程(OS和嵌入式),库,游戏和跨平台的通用编程语言。该标记应与ISO 9899标准(除非另有说明,最新版本9899:2018中定义的有关C语言的一般问题)一起使用-还要使用c89,c99,c11等标记特定于版本的请求。C与C ++截然不同,在没有合理理由的情况下,不应将其与C ++标记结合使用。


7
C / C ++:强制位字段顺序和对齐
我读到,结构中位字段的顺序是特定于平台的。如果我使用不同的特定于编译器的打包选项,那该如何保证数据在写入时以正确的顺序存储?例如: struct Message { unsigned int version : 3; unsigned int type : 1; unsigned int id : 5; unsigned int data : 6; } __attribute__ ((__packed__)); 在具有GCC编译器的Intel处理器上,这些字段如图所示布置在内存中。Message.version是缓冲区的前3位,然后Message.type是。如果我为各种编译器找到了等效的struct包装选项,这是否可以跨平台使用?



4
导入库如何工作?细节?
我知道这对于极客来说似乎很基础。但我想使它变得清晰。 当我想使用Win32 DLL时,通常只调用LoadLibrary()和GetProcAdderss()之类的API。但是最近,我正在使用DirectX9进行开发,并且需要添加d3d9.lib,d3dx9.lib等文件。 我已经足够了解LIB用于静态链接,而DLL用于动态链接。 因此,我目前的理解是LIB包含方法的实现,并且在链接时作为最终EXE文件的一部分静态链接。DLL是在运行时动态加载的,而不是最终EXE文件的一部分。 但是有时,DLL文件会附带一些LIB文件,因此: 这些LIB文件是做什么用的? 他们如何实现目标? 有没有什么工具可以让我检查这些LIB文件的内部? 更新1 检查维基百科之后,我记得这些LIB文件称为import library。但是我想知道它如何与我的主应用程序以及动态加载的DLL一起使用。 更新2 就像RBerteig所说的那样,DLL附带的LIB文件中有一些存根代码。因此,调用顺序应如下所示: 我的主要应用程序-> LIB中的存根->实际目标DLL 那么这些LIB应该包含哪些信息?我可以想到以下几点: LIB文件应包含相应DLL的完整路径。因此,DLL可以由运行时加载。 每个DLL导出方法的入口点的相对地址(或文件偏移量?)应在存根中进行编码;因此可以进行正确的跳转/方法调用。 我对吗?还有更多吗? 顺便说一句:是否有任何工具可以检查导入库?如果我能看到它,就不会再有疑问了。
87 c++  c  windows  visual-c++ 

12
打印文本而不是C枚举值
int main() { enum Days{Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday}; Days TheDay; int j = 0; printf("Please enter the day of the week (0 to 6)\n"); scanf("%d",&j); TheDay = Days(j); //how to PRINT THE VALUES stored in TheDay printf("%s",TheDay); // isnt working return 0; }
87 c  enums 


4
scanf()将新行char留在缓冲区中
我有以下程序: int main(int argc, char *argv[]) { int a, b; char c1, c2; printf("Enter something: "); scanf("%d",&a); // line 1 printf("Enter other something: "); scanf("%d", &b); // line 2 printf("Enter a char: "); scanf("%c",&c1); // line 3 printf("Enter another char: "); scanf("%c", &c2); // line 4 printf("Done"); // line 5 …
87 c  scanf 

5
为什么C和C ++支持在结构中对数组进行成员分配,但通常不支持?
我了解不支持数组的成员分配,因此以下操作将不起作用: int num1[3] = {1,2,3}; int num2[3]; num2 = num1; // "error: invalid array assignment" 我只是接受这一事实,认为该语言的目的是提供一个开放式框架,并让用户决定如何实现某些功能,例如复制数组。 但是,以下方法确实有效: struct myStruct { int num[3]; }; struct myStruct struct1 = {{1,2,3}}; struct myStruct struct2; struct2 = struct1; 该阵列num[3]是构件明智从它的实例在分配struct1到其实例在struct2。 为什么结构支持数组的成员分配,但通常不支持? 编辑:在结构中std :: string线程中Roger Pate的注释-复制/分配问题?似乎指出了答案的总体方向,但我自己知道的还不够。 编辑2:许多出色的回应。我之所以选择Luther Blissett,是因为我主要想知道该行为背后的哲学或历史原理,但是James McNellis对相关规范文档的引用也很有用。

3
如何在OpenGL中使用glOrtho()?
我不了解的用法glOrtho。有人可以解释它的用途吗? 是否用于设置xy和z坐标限制的范围? glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); 这意味着x,y和z范围是-1到1?
87 c++  c  opengl 

3
在哪里可以找到PDF格式的C89 / C90标准?
我正在寻找C89 / C90标准的免费副本版本,但在任何地方都找不到!为什么很难找到它? C99和C11标准很容易在Internet上获得。即使在Stack Overflow问题中,在哪里也可以找到最新的C或C ++标准文档?和C标准,获取标准不包含我要查找的内容。 网络搜索也没有帮助,开放标准也没有帮助。
87 c  ansi  c89 

1
gcc / g ++:“没有这样的文件或目录”
g++ 给我以下形式的错误: foo.cc:<line>:<column>: fatal error: <bar>: No such file or directory compilation terminated. 使用编译C程序时相同gcc。 这是为什么? 请注意:这个问题已经被问过很多次了,但是每次都针对询问者的情况。这个问题的目的是要提出一个问题,即其他人可以作为的复制品一劳永逸地关闭;一个常见问题。
87 c++  c  gcc  g++  c++-faq 

4
为什么rand()在Linux上重复的次数比Mac重复得多?
当我发现rand()Linux上的重复次数似乎比Mac上重复的次数要多时,我正在C中实现一个哈希图,这是我正在研究的项目的一部分,并使用随机插入进行测试。RAND_MAX在两个平台上均为2147483647 / 0x7FFFFFFF。我将其简化为该测试程序,该程序使字节数组RAND_MAX+1-long,生成RAND_MAX随机数,记录每个数字是否重复,并从列表中将其检查出。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> int main() { size_t size = ((size_t)RAND_MAX) + 1; char *randoms = calloc(size, sizeof(char)); int dups = 0; srand(time(0)); for (int i = 0; i < RAND_MAX; i++) { int r = rand(); if (randoms[r]) { // printf("duplicate at …
86 c  linux  macos  random 

12
在循环中的什么时候整数溢出会变成未定义的行为?
这是一个示例来说明我的问题,其中涉及一些我无法在此处发布的更复杂的代码。 #include <stdio.h> int main() { int a = 0; for (int i = 0; i < 3; i++) { printf("Hello\n"); a = a + 1000000000; } } 该程序在我的平台上包含未定义的行为,因为a它将在第3个循环中溢出。 这是否会使整个程序具有未定义的行为,还是仅在实际发生溢出之后?编译器是否可以解决a 将导致溢出的问题,以便它可以声明整个循环未定义,并且即使它们都在溢出之前发生,也不必费心运行printfs? (尽管标记为C和C ++有所不同,但如果它们不相同,我会对两种语言的答案都感兴趣。)


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.