Tag: gcc

C语句的最大语句长度

C中定义的语句是否有最大长度? 编译器是gcc

使用SCons更改Linux中的默认C编译器

在我的Linux平台上,我有几个版本的gcc 。 在usr/bin我有: gcc34 gcc44 gcc 以下是一些输出: $ gcc –version gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-48) $ gcc44 –version gcc44 (GCC) 4.4.0 20090514 (Red Hat 4.4.0-6) 我需要使用4.4版本的gcc但默认似乎是4.1版本。 我有办法替换/usr/bin/gcc并使gcc44成为默认编译器而不使用符号链接到/usr/bin/gcc44吗? 我不能使用符号链接的原因是因为我的代码必须使用mock在RPM包中提供。 mock从头开始创建一个最小的linux安装,并在编译我的代码之前安装指定的依赖项。 我不能自定义这个“最小安装”。 理想情况下,完美的解决方案是安装一个官方RPM软件包,用gcc44替换gcc作为默认编译器。 有这样的套餐吗? 这甚至可能/好吗? 附加信息 我必须使用SCons (替代品)并且它不允许我指定用于gcc的二进制文件。 我也会接受任何答案,告诉我如何在我的SConstruct文件中指定gcc二进制文件。

C和C ++中寄存器变量的地址

我知道寄存器变量的概念和它的用例,但根据我的尝试,我脑子里几乎没有问题。 我无法访问C中的寄存器变量的地址,虽然我可以做C ++! 为什么? 访问寄存器变量的寻址有什么问题吗? 假设我在C ++中声明一个字符串变量作为寄存器,那么该变量将存储在哪里? 将C ++中的’string’等非数字数据类型的存储类声明为寄存器有什么意义? 更新:我认为C ++允许我们获取寄存器变量的地址,因为我的程序中没有出现任何错误,如下所示: #include #include using namespace std; clock_t beg, en; int main(){ int j, k=0; beg=clock(); for(register int i=0;i<10000000;i++){ /*if(k==0){ cout<<&i<<endl; // if this code is uncommented, then C++ rejects the recommendation to make 'i' as register k++; }*/ } en=clock(); cout<<en-beg<<endl; cout<<&j<<endl<<&k; return 0; } […]

Qt Creator上的预处理器输出

我在Qt Creator中编译C代码,我需要查看预处理器输出。 我在make中添加了-E标志,但是我没有看到* .i文件: mingw32-make.exe -e -w in \qt\qt-build-desktop 请帮忙。

混合C和汇编文件

我想使用g ++在我的C ++程序中使用裸函数 。 不幸的是,与VC ++不同,g ++不支持裸函数,管理它的唯一方法是在单独的文件中编写自己的汇编代码并与C ++文件链接。 我试图找到一些很好的x86教程来混合汇编和C / C ++文件,但找不到任何好的。 如果您知道任何问题,请告诉我。 请注意,除了在C或程序集中使用它们之外,我不是要求内联汇编而是链接C和汇编文件以及在汇编中声明C的外部变量的方法,反之亦然,以及使用Makefile链接C和asm文件的方法。

如何阻止gcc通过标准库路径传递-L到链接器

我有一个脚本需要阻止gcc传递-L标准库路径到ld 。 使用-nostdlib抑制-lc -lgcc等但不抑制-L 。 使用-Wl,-nostdlib可以防止链接器使用自己的标准路径,但不会阻止gcc使用标准路径传递-L 。 有没有办法确保gcc在库路径中没有任何内容调用链接器期望我在命令行上显式写入的目录?

ARM未对齐的内存访问解决方法

我必须将源代码移植到运行Linux的ARM平台。 不幸的是,我遇到了未对齐的内存访问问题。 源使用指针强制转换和访问。 像下面这样的代码像病毒一样遍布代码库。 由于gcc -Wcast-align命令行选项,我可以查明有问题的位置,但是有超过一千个实例要经历。 u = (IEC_BOOL); (((*(IEC_LINT*)pSP).H < bH) || (((*(IEC_LINT*)pSP).H == bH) && ((*(IEC_LINT*)pSP).L > u); *(IEC_DWORD OS_SPTR *)pSP = (IEC_DWORD)(*(IEC_DWORD OS_SPTR *)pSP < bL))) ? 1 : 0); u = (IEC_BYTE)((*(IEC_REAL*)pSP >= b) ? 1 : 0); 使用echo 2 > /proc/cpu/alignment on会使Linux内核修复问题,但应用程序的性能会降低到不再可接受的程度。 我在网上搜索了类似于GCC(v4.4.1)编译器的__unaligned或__packed关键字,但截至目前为止还是空的。 我认为很多问题的代码行可以通过一个或多或少复杂的正则表达式/替换来修复,但现在,在我做了一段时间之后,我发现,这种方法也需要大量繁琐的工作。 你们有什么建议如何完成这项工作? 我认为一个gcc 4.5编译器插件会有点矫枉过正但是有没有比正则表达式好的东西? 您还能提出哪些其他建议? 不一定所有问题实例都必须修复,因为我仍然可以依赖内核来处理一些罕见的情况。

在OpenMP中使用GDB

使用GDB我似乎无法在OpenMP线程中打印共享变量的值。 例如,使用以下程序: #include #include #include int main(int argc, char *argv[]) { int priv, tid, pub = 100; #pragma omp parallel private(priv, tid) num_threads(2) { tid = omp_get_thread_num(); priv = tid * 10; #pragma omp sections { #pragma omp section { printf(“SECTION 0: tid=%d, priv=%d, pub=%d\n”, tid, priv, pub); } #pragma omp section { printf(“SECTION 1: […]

可以在没有明确大小的情况下初始化C中的二维数组吗?

我有一个关于C中的二维数组的问题。我现在知道(从直接编译器经验)我不能像这样一维数组初始化这样的数组: int multi_array[][] = { {1,2,3,4,5}, {10,20,30,40,50}, {100,200,300,400,500} }; > compiler output: gcc -o arrays arrays.c arrays.c: In function ‘main’: arrays.c:8:9: error: array type has incomplete element type 最接近的解决方案是明确提供列数如下: int multi_array[][5] = { {1,2,3,4,5}, {10,20,30,40,50}, {100,200,300,400,500} }; 我的问题是:如果不明确地提供数字(这毕竟编译器应该能够推断自己),它可以整齐地完成吗? 我不是在谈论用malloc或其他东西手工构建它,而是与我尝试的东西接近。 另外,对C编译器有所了解的人可以从低级别的角度解释为什么我的初始尝试不起作用吗? 我使用了没有非标准选项的普通gcc来编译代码。 谢谢

gcc复合常数折叠

似乎gcc对复杂的常量折叠有一些限制。 这是一个例子: static inline unsigned int DJBHash(const char *str) { int i; unsigned int hash = 5381; for(i = 0; i < strlen(str); i++) { hash = ((hash << 5) + hash) + str[i]; } return hash; } int f(void) { return DJBHash("01234567890123456"); } 当使用-O3优化级别(gcc 4.8)运行时,它很好地展开了DJBHash中的循环,并在编译期间计算该字符串的哈希值。 但是,当字符串长一个字符时, return DJBHash(“012345678901234567”); 它不再折叠它并使用条件跳转指令生成循环。 我想将任意长度的文字字符串折叠为其哈希值作为编译时常量。 这可以吗? 澄清 我的问题是关于gcc的常量折叠优化(参见标题 – […]