Tag: gcc

struct中间的可变长度数组 – 为什么这个C代码对gcc有效

使用VLA(可变长度数组)有一些奇怪的代码,它被gcc 4.6视为有效C(C99,C11): $ cat ac int main(int argc,char**argv) { struct args_t{ int a; int params[argc]; // << Wat? // VLA in the middle of some struct, between other fields int b; } args; args.b=0; for(args.a=0;args.a<argc;args.a++) { args.params[args.a]=argv[0][0]; args.b++; } return args.b; } 编译时此代码没有警告: $ gcc-4.6 -Wall -std=c99 ac && echo $? 0 $ ./a.out ; […]

如何在C代码中获取变量的类型?

有没有什么方法可以在C中自动发现变量的类型,或者通过程序本身的某种机制,或者 – 更可能 – 通过使用编译器的预编译脚本传递到它的位置解析了变量并为它们分配了类型? 我正在寻找关于此的一般性建议。 下面是关于我需要什么和为什么的更多背景。 我想改变OpenMP减少子句的语义。 在这一点上,简单地通过调用函数替换源代码中的子句(通过脚本)似乎是最容易的,然后我可以定义函数来实现我想要的缩减语义。 例如,我的脚本会转换它 #pragma omp parallel for reduction(+:x) 进入这个: my_reduction(PLUS, &x, sizeof(x)); #pragma omp parallel for 在哪里,我早些时候(比方说) enum reduction_op {PLUS, MINUS, TIMES, AND, OR, BIT_AND, BIT_OR, BIT_XOR, /* … */}; 并且my_reduction有签名 void my_reduction(enum reduction_op op, void * var, size_t size); 除此之外, my_reduction必须像程序员最初预期的那样将加法运算应用于简化变量。 但我的function无法知道如何正确地做到这一点。 特别是,虽然它知道操作的类型( PLUS ),原始变量的位置( var )以及变量类型的大小,但它不知道变量的类型本身。 […]

如何在code :: blocks中更改文本颜色和控制台颜色?

我正在用C编写程序。我想在控制台中更改文本颜色和背景颜色。 我的示例程序是 – #include #include #include #include #include int main(int argc,char *argv[]) { textcolor(25); printf(“\n \n \t This is dummy program for text color “); getch(); return 0; } 当我编译这个程序代码:: blocks给我一个错误 – textcolor未定义。 为什么会这样? 我在GNU GCC编译器和Windows Vista中工作。 如果它不起作用什么是textcolor的副本。 就像我想要改变控制台的背景颜色。 编译器给出了同样的错误,只是函数的名称不同。 如何更改控制台和文本的颜色。 请帮忙。 即使答案是在C ++中,我也没关系。

在GCC中启用严格浮点模式

我还没有创建一个程序来查看GCC是否需要它通过,当我这样做时,我想知道如何启用严格的浮点模式,这将允许运行和计算机之间的可重现结果,谢谢。

如何打印具有相同名称的全局变量和局部变量的值?

这是我的代码,我想打印15和12,但由于实例成员隐藏a的本地值被打印两次。 #include int a = 12; int main() { int a = 15; printf(“Inside a’s main local a = : %d\n”,a); printf(“In a global a = %d\n”,a); return 0; } 为什么以及有没有办法在c中打印它? …顺便说一下,我在c ++中知道它。

数组结构和结构数组 – 性能差异

我有一个这样的课: //Array of Structures class Unit { public: float v; float u; //And similarly many other variables of float type, upto 10-12 of them. void update() { v+=u; v=v*i*t; //And many other equations } }; 我创建了一个Unit类型的对象数组。 并调用它们的更新。 int NUM_UNITS = 10000; void ProcessUpdate() { Unit *units = new Unit[NUM_UNITS]; for(int i = 0; i < […]

‘从some_type **到const some_type **’的转换无效

我有一个函数需要const some_type**作为参数( some_type是一个结构,函数需要一个指向这种类型数组的指针)。 我声明了some_type*类型的局部变量,并对其进行了初始化。 然后我将函数称为f(&some_array) ,编译器(gcc)说: error: invalid conversion from ‘some_type**’ to ‘const some_type**’ 这有什么问题? 为什么我不能将变量转换为const?

__STDC_IEC_559__与现代C编译器的状态

C99添加了一个宏__STDC_IEC_559__ ,可用于测试编译器和标准库是否符合ISO / IEC / IEEE 60559(或IEEE 754)标准。 根据这个问题的答案 如何检查 – ieee-754-单精度-32位浮点表示大多数C编译器不设置预处理器宏__STDC_IEC_559__ 。 根据GCC的文档,它没有定义__STDC_IEC_559__ 。 我用GCC 4.9.2和Clang 3.6.0测试了这两个,使用glibc 2.21使用以下代码。 //test.c //#include int main(void) { #if defined ( __STDC_IEC_559__ ) //#if defined ( __GCC_IEC_559__ ) return 1; #else return 0; #endif } 然后 echo $? 这表明使用此代码__STDC_IEC_559__是使用GCC定义的,而不是使用Clang定义的。 然后我做了gcc -E ,它显示了包含文件stdc-predef.h 。 该文件定义__STDC_IEC_559__ 。 /* glibc’s intent is […]

使用pragma pack(1)时是否存在性能问题?

我们的头文件在我们的大多数结构中使用#pragma pack(1) (用于网络和文件I / O)。 据我所知,它将结构的对齐方式从默认的8个字节更改为1个字节的对齐方式。 假设一切都在32位Linux(也许是Windows)中运行,那么这种打包对齐是否有任何性能损失? 我不关心库的可移植性,但更关注文件和网络I / O与不同#pragma包的兼容性以及性能问题。

Eclipse C / C ++(CDT)add -l选项(链接数学模块)gcc -lm

我试图让Linux上的eclipse(Ubuntu)链接数学模块。 通常我会链接gcc -lm。 如何让eclipse添加这个? 它是在Project-> Properties下的库路径中吗? 数学模块在Linux Ubuntu系统上的位置是什么?