我有这个简单的测试文件: #include “stack.h” int main() { Stack* stck = init_stack(); return 0; } 和stack.h定义如下: #ifndef STACK_H #define STACK_H #define EMPTY_STACK -1 typedef struct stack { char ch; struct stack* prev; } Stack; extern Stack* init_stack(); extern char pop(Stack*); extern void push(Stack*, char); #endif 这两个文件位于同一目录中。 但是当我做gcc ..来构建它时,我不断收到以下错误: $ ls stack.c stack.h teststack.c $ gcc -o testit […]
我正在编写嵌入式固件,并发现有时很难确定何时需要使用volatile。 当我有一个等待某个布尔标志被中断改变的函数时,很明显该标志需要是易失性的,因为该函数会永远等待,因为编译器没有意识到该值可以由打断。 但是当我有一个只检查第一行中的标志的短函数时,我希望标志不需要是易失性的,因为每次进入函数时它的值都会被读取? 所以当一个中断在我第一次调用函数和第二次调用函数之间修改它的值时,我将获得最新的值。 或者是否无法保证每次进入该function时都会清除所有缓存寄存器?
在学校的计算机实验室,我们使用fputs编写了一个程序,并且编译器返回了一个错误gets is a dangerous function to use和fputs的类似错误 但在家里,当我输入这段代码: #include main() { FILE *fp; char name[20]; fp = fopen(“name.txt”,”w”); gets(name); fputs(name,fp); fclose(fp); } 我什么都没有得到任何错误。 在学校的那个与这个相似,只是有点冗长而且有更多的变数。 我在家里使用codeblocks,在学校使用fedora提供的默认gcc。 这可能是编译器的问题吗?
valgrind在用gcc5.1, g++ ./a.cpp编译的空程序中检测到“仍然可以到达的泄漏”, int main () {} valgrind说, valgrind ./a.out , ==32037== HEAP SUMMARY: ==32037== in use at exit: 72,704 bytes in 1 blocks ==32037== total heap usage: 1 allocs, 0 frees, 72,704 bytes allocated ==32037== ==32037== LEAK SUMMARY: ==32037== definitely lost: 0 bytes in 0 blocks ==32037== indirectly lost: 0 bytes in 0 blocks […]
我正在尝试使用mingw-x64在Windows7(64位)上为python编译C库。 这一切都像32位版本的魅力。 我以前使用gcc -shared -IC编译我的库:\ Python27 \ include -LC:\ Python27 \ libs myModule.c -lpython27 -o myModule.pyd 它适用于32位版本。 相同的过程适用于64位Linux。 但是在64位windows7上(使用64位x86_64-w64-mingw32和64位python 2.7.5)我遇到了一个问题: C:\Users\sergej\AppData\Local\Temp\cci8TbXw.o:myModule.c:(.text+0x267): undefined reference to `__imp_Py_InitModule4′ collect2: ld returned 1 exit status 我检查了C:/Python27/libs/modsupport.h,它已经包含了 #if SIZEOF_SIZE_T != SIZEOF_INT /* On a 64-bit system, rename the Py_InitModule4 so that 2.4 modules cannot get loaded into a 2.5 interpreter […]
我编写了一个具有power.h函数的C代码,该代码来自math.h库。 当我编译我的程序时,我收到一个错误,即“未定义引用’pow’函数”,我使用gcc编译器(fedora 9)编译我的程序。 我将-lm标志插入gcc然后,错误被省略,但pow函数的输出为0。 #include main() { double a = 4, b = 2; b = pow(b,a); } 谁能帮我? 我的编译器有问题吗? 谢谢。
我正在努力将我的代码缩小到最小的裸骨大小! 我使用的STM32F0只有32k闪存,需要大部分闪存用于数据存储。 我的代码已经有大约20k的闪存大小! 其中一些原因是由于使用了STM32 HALfunction,我可以根据需要对其进行解释和优化。 但是,我最大的flash消费者是所有隐含的库例程。 我似乎无法删除这些function。 它们不会在我的代码或任何HAL代码中的任何位置调用。 诸如_malloc_r(1.3k字节)和__vfiprintf_r(3kB)以及许多其他function正在使用我的闪存的很大一部分。 我认为这些都是libc函数。 我不使用这些并希望它们消失! 有谁知道如何删除这些? 我尝试了不同的优化级别和链接器选项但到目前为止没有运气。 我试过-nostdlib和–specs = nosys.specs没有变化。 如果我删除我的文件与_exit等函数的定义我得到一个链接器错误,表明该库仍然包含在内,需要这些。 链接器映射也确认存在许多不需要的function! 有什么建议?
我有以下周期: //condition will be set here to true or false for (int i = 0; i < LARGE_NUMBER; i++) { if (condition) { //do foo } else { //do bar } } 假设:没有条件而不是条件的周期更快。 (这是真的吗?)问题:如果condition已经设置在for循环之外,并且循环本身没有触及condition ,那么gcc会将我的if ,if 如果没有,我应该切换if和for ,重复代码,违反DRY等。
背景 我有一个项目,我有两个单独的产品具有几乎相同的宏名称,为此我想创建一个类似宏的函数来快速检索宏的值。 我编写了一个getTranslation宏函数来获取提供给“函数”的文字文本,该函数应该被视为字符串和字符串前缀(如下所示)。 题 我如何完成获取提供给宏的参数,将它们连接在一起(中间带有下划线),并将该结果视为预处理器宏而不是字符串? 代码清单 /******************************************************************************* * coconut.h ******************************************************************************/ #define COCONUT (PRODUCT_COCONUT) #define COCONUT_FX_REGISTER (100) #define COCONUT_BASE_REGISTER (101) /******************************************************************************* * pineapple.h ******************************************************************************/ #define PINEAPPLE (PRODUCT_PINEAPPLE) #define PINEAPPLE_FX_REGISTER (200) #define PINEAPPLE_BASE_REGISTER (201) /******************************************************************************* * test.c. ******************************************************************************/ #include #include “translation.h” #include “coconut.h” int main(void) { int i = getTranslation(FX_REGISTER, COCONUT); printf(“Translation:%d.\n”, i); return 0; } /******************************************************************************* […]
例如,哪个gcc版本支持c99? 是否有表格或图表来显示gcc和g ++的标准支持状态? gcc和g ++是如何演变的? 谢谢〜