C宏来创建字符串

替代标题(以帮助搜索) 将预处理程序标记转换为字符串 如何从C宏的值创建一个char字符串? 原始问题 我想使用C #define在编译时构建文字字符串。 该字符串是为调试,发布等而更改的域。 我想要一些这样的事情: #ifdef __TESTING #define IV_DOMAIN domain.org //in house testing #elif __LIVE_TESTING #define IV_DOMAIN test.domain.com //live testing servers #else #define IV_DOMAIN domain.com //production #endif // Sub-Domain #define IV_SECURE “secure.IV_DOMAIN” //secure.domain.org etc #define IV_MOBILE “m.IV_DOMAIN” 但预处理器不评估“”内的任何内容 有没有解决的办法? 这是一个好主意吗?

void指针:C和C ++之间的区别

我试图理解C和C ++之间关于void指针的区别。 以下用C语言编译但不用C ++编译(用gcc / g ++ -ansi -pedantic -Wall完成的所有编译): int* p = malloc(sizeof(int)); 因为malloc返回void* ,C允许分配给int*而C允许这样做。 但是,这里: void foo(void* vptr) { } int main() { int* p = (int*) malloc(sizeof(int)); foo(p); return 0; } C ++和C都编译它没有抱怨。 为什么? K&R2说: 任何指向对象的指针都可以转换为void *类型而不会丢失信息。 如果结果转换回原始指针类型,则恢复原始指针。 这很好地总结了C中的void*转换.C ++标准规定了什么?

我应该使用字符串文字来释放char *吗?

我应该在使用字符串文字初始化时释放char*变量吗? 对我来说,语法会让我假设它们只是堆栈分配,但这个例子告诉我,它们不是。 #include #include static char* globalBuffer; typedef struct Container { char* buffer; } Container; Container* Container_new(char* buffer) { Container* container = malloc(sizeof(Container)); container->buffer = buffer; globalBuffer = buffer; return container; } void Container_print(Container* container) { if (container->buffer != NULL) { printf(container->buffer); printf(“\n”); } else { printf(“Container contains a NULL-buffer.”); } } Container* stage() { […]

每个源文件的标头

我试图了解每个源文件方法一个标头背后的目的。 正如我所看到的,标题用于在使用它们的几个文件之间共享函数声明, typedef和macro。 当您为.c文件创建头文件时,它的缺点是每次要查看函数声明或宏时都需要引用头文件,通常一切都在一个源文件中更简单(不是整个软件,当然)。 那么为什么程序员会使用这种方法呢?

使用scanf进行分段错误

noob问题:我正在尝试编写一个简单的菜单界面,但我不断收到分段错误,我无法弄清楚原因。 #include #include int flush(); int add(char *name, char *password, char *type); int delete(char *name); int edit(char *name, char *password, char *type, char *newName, char *newPassword, char *newType); int verify(char *name, char *password); int menu(){ int input; char *name, *password, *type, *newName, *newPassword, *newType; printf(“MAIN MENU \n ============\n”); printf(“1. ADD\n”); printf(“2. DELETE\n”); printf(“3. EDIT\n”); printf(“4. […]

如何执行_mm256_movemask_epi8(VPMOVMSKB)的反转?

内在的: int mask = _mm256_movemask_epi8(__m256i s1) 创建一个掩码,其32位对应于s1的每个字节的最高位。 在使用位操作(例如BMI2 )操作掩码之后,我想执行_mm256_movemask_epi8的反转,即创建__m256i向量,其中每个字节的最高有效位包含uint32_t mask的相应位。 做这个的最好方式是什么? 编辑:我需要执行逆操作,因为内部_mm256_blendv_epi8只接受__m256i类型的掩码而不是uint32_t 。 因此,在生成的__m256i掩码中,我可以忽略每个字节的MSB以外的位。

如何在C中最好地编写体素引擎并考虑到性能

我是OpenGl中的一个电枢,因此我只想学习现代OpenGl 4.x的东西。 一旦我完成了基本教程(例如旋转立方体),我决定尝试创建一个基于体素的程序,仅处理立方体。 这个程序的目标是快速,使用有限的CPU功率和内存,并且是动态的,因此地图大小可以改变,只有在数组中它表示块被填充时才会绘制块。 我有一个VBO,其中包含由三角形构成的立方体的顶点和索引。 一开始,如果渲染函数我告诉OpenGl要使用的着色器,然后在完成后绑定VBO我执行此循环 绘制立方体循环: //The letter_max are the dimensions of the matrix created to store the voxel status in // The method I use for getting and setting entries in the map are very efficient so I have not included it in this example for(int z = -(z_max / 2); z < […]

读取stdin冲洗stdout吗?

当连接到终端时,stdout是行缓冲的,但我记得在某处阅读(至少从stdin)将自动刷新stdout。 我使用的所有C实现都已经完成了,但我现在无法在标准中找到它。 它确实有意义,它是这样的,否则代码是这样的: printf(“Type some input: “); fgets(line, sizeof line, stdin); 需要额外的fflush(stdout); 那么stdout保证会在这里刷新吗? 编辑: 正如几个回复所说,标准中似乎无法保证我的示例中的stdout输出将在从stdin读取之前出现,但另一方面,这个意图在(我的免费草稿副本)中说明了标准: 交互设备的输入和输出动态应按照7.19.3的规定进行。 这些要求的目的是尽快出现无缓冲或行缓冲输出,以确保在程序等待输入之前实际出现提示消息。 (ISO / IEC 9899:TC2委员会草案 – 2005年5月6日,第14页)。 所以似乎没有保证,但无论如何它可能适用于大多数实现。 (著名遗言…)

移位32位变量32位有什么不好?

我最近选择了Bruce Schneier的Applied Cryptography副本,这是一本很好的阅读。 我现在明白本书中概述的几种算法是如何工作的,我想在C中开始实现其中的一些算法。 许多算法的共同点是将x位密钥分成几个较小的y位密钥。 例如,Blowfish的密钥X是64位,但是你需要将它分成两个32位的一半; Xl和Xr。 这就是我陷入困境的地方。 我对C相当不错,但对于按位运算符等,我并不是最强的。 在IRC上获得一些帮助之后,我设法提出了这两个宏: #define splitup(a, b, c) {b = a >> 32; c = a & 0xffffffff; } #define combine(a, b, c) {a = (c << 32) | a;} 其中a是64位,b和c是32位。 但是,编译器警告我,我正在将32位变量移位32位。 我的问题是这些: 移位32位变量32位有什么不好? 我猜它是未定义的,但这些宏似乎确实有效。 另外,你会建议我换一种方式吗? 正如我所说的,我对C非常熟悉,但是按位运算符等仍让我头疼。 编辑 我发现我的组合宏实际上并没有组合两个32位变量,而只是简单地将0和0相加,并得到一个结果。 所以,除了我以前的问题,我仍然没有一种方法将两个32位变量组合起来得到一个64位变量; 关于如何做的建议将不胜感激。

当y是整数时,fmod()是否准确?

在使用double fmod(double x, double y)且y是整数时,结果似乎总是精确的。 (这是一个完整的数字,在这里不是int 。) 也许C 不需要 fmod()在这些选择的情况下提供精确的答案,但是在我尝试过的编译器上,结果是准确的,即使x/y的商不能完全表示。 当y是整数时,是否期望得到确切的答案? 如果没有,请提供一个反例。 例子: double x = 1e10; // x = 10000000000 printf(“%.50g\n”, fmod(x, 100)); // prints 0 x = 1e60; // x = 999999999999999949387135297074018866963645011013410073083904 printf(“%.50g\n”, fmod(x, 100)); // prints 4 x = DBL_MAX; // x = 179769313486231570…6184124858368 printf(“%.50g\n”, fmod(x, 100)); // prints 68 x = […]