我知道何时使用补鞋匠列表(例如列出在程序集中修改的寄存器,以便它不被选择用作输入寄存器等),但我无法绕过早期约束条件& 。 如果列出输出,那是否已经意味着输入不能使用所选寄存器(除了匹配数字约束)? 例如: asm( “movl $1, %0;” “addl $3, %0;” “addl $4, %1;” “addl %1, %0;” : “=g”(num_out) : “g”(num_in) : ); 输出变量会不会甚至需要? 编译器应该知道为输出选择的寄存器,因此知道不要将它用于输入。
我很好奇,当你尝试混合变量声明和代码时,为什么C89编译器会转储给你,例如: rutski@imac:~$ cat test.c #include int main(void) { printf(“Hello World!\n”); int x = 7; printf(“%d!\n”, x); return 0; } rutski@imac:~$ gcc -std=c89 -pedantic test.c test.c: In function ‘main’: test.c:7: warning: ISO C90 forbids mixed declarations and code rutski@imac:~$ 是的,你可以避免这种事情,远离-pedantic。 但是,您的代码不再符合标准。 正如任何能够回答这篇文章的人可能已经知道的那样,这不仅仅是一个理论上的问题。 像Microsoft的C编译器这样的平台在任何和所有情况下都可以在标准中快速执行。 鉴于古老的C是多么的,我认为这个特征是由于一些历史问题可以追溯到70年代的非凡硬件限制,但我不知道细节。 或者我完全错了吗?
我有一些.so库,我想将它们合并到一个共享库中,这样它就不再依赖于原始的.so文件了。 .so文件彼此依赖。 我怎样才能做到这一点? 我可以这样做吗?
来自http://www.adp-gmbh.ch/cpp/gcc/create_lib.html : 注意:库必须以三个字母lib开头并具有后缀.a 。 这是一个操作系统约定,还是gcc / ar quirk? Xcode似乎能够创建没有前缀的库。 它有什么不同的做法?
如果cc配置设置为使用-Werror ,有没有办法在使用make时覆盖终端的-Werror标志?
我想从多个来源为我的项目创建一个静态.a库,其中一些定义弱函数,另一些实现它们。 比方说我有: lib1.c: void defaultHandler() { for(;;); } void myHandler() __attribute__((weak, alias (“defaultHandler”))); lib2.c: void myHandler() { /* do my stuff here */ } 然后我想把它们放到一个单独的库中,这样它对于最终应用程序来说似乎是透明的 $ ar -r libhandlers.a lib1.o lib2.o 但是在myHandler中现在有2个符号myHandler: $ nm libhandlers.a | grep “myHandler” 00000001 W myHandler 00000581 T myHandler 然后在使用lib时,弱引用被链接。 我目前唯一的解决方案是不包含在库lib2.c而是将其作为源添加到应用程序的Makefile中…这是不满意的,因为我只想提供几个库而不是一大堆文件。 –whole-archive选项也不令人满意,因为我在嵌入式系统上工作,我不想包含所有我不需要的东西。 有没有办法编译库,以便弱符号消失,如果提供强大的符号? 注意:我使用的是arm-none-eabi-gcc v4.8
使用gcc 4.4.5,我发出以下代码的警告。 char *f(void) { char c; return &c; } 但是,当我使用临时指针时,不再有警告(即使行为是错误的)。 char *f(void) { char c; char *p = &c; return p; } 我听说C中的指针分析很难,但gcc可以警告这样的代码吗?
我正在使用gcc-4.7 (Ubuntu/Linaro 4.7.2-11precise2) 4.7.2遇到一个非常奇怪的问题。 我没有警告就无法编译以下有效代码: extern void dostuff(void); int test(int arg1, int arg2) { int ret; if (arg1) ret = arg2 ? 1 : 2; dostuff(); if (arg1) return ret; return 0; } 编译选项和输出: $ gcc-4.7 -o test.o -c -Os test.c -Wall test.c: In function ‘test’: test.c:5:6: warning: ‘ret’ may be used uninitialized in this […]
在MSVC ++编译器上,可以对特定大小的整数使用__int8 , __int16 , __int32和类似类型。 这对于需要使用低级数据结构(如自定义文件格式,硬件控制数据结构等)的应用程序非常有用。 我可以在GCC编译器上使用类似的等价物吗?
是否可以关闭特定function的优化? 我的一个朋友有一个问题,gcc优化使一些(我不知道)μ控制器代码不起作用。 我们知道它是哪些函数,但我们不知道代码本身,所以最简单和最安全的方法可能就是为整个函数关闭它。 遗憾的是http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html显示有一个优化函数属性/ pragma,但它需要gcc 4.4,这是我们没有的。 提前致谢