我想使用gcc预处理器编写几乎相同的代码声明500次。 让我们说出于演示目的,我想使用宏FOR_MACRO : #define FOR_MACRO(x) \ #for i in {1 … x}: \ const int arr_len_##x[i] = {i}; 并调用FOR_MACRO(100)将转换为: const int arr_len_1[1] = {1}; const int arr_len_2[2] = {2}; … const int arr_len_100[100] = {100};
为什么以下程序不会抛出错误: dfljshfksdhfl; #include int main () { return 0; } gcc会发出警告: test.c:1:1:警告:数据定义没有类型或存储类[默认启用]
以下代码行,在堆栈上创建一个可变长度数组: char name[length] = {‘\0’}; 生成以下编译器诊断: error: variable-sized object may not be initialized warning: excess elements in array initializer warning: (near initialization for ‘name’) 有哪些选项可用于初始化VLA? 我被迫使用如下行: memset(name, 0, sizeof(name)); 代替?
在为gcc编译器的-O2优化运行一些测试时,我在函数的反汇编代码中观察到以下指令: data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 这个指令做了什么? 为了更详细,我试图了解编译器如何使用O2优化优化无用的递归,如下所示: int foo(void) { return foo(); } int main (void) { return foo(); } 上面的代码在没有优化的情况下编译时导致堆栈溢出,但适用于O2优化代码。 我认为使用O2它完全删除了推送函数foo的堆栈,但为什么data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1)需要? 0000000000400480 : foo(): 400480: eb fe jmp 400480 400482: 66 66 66 66 66 2e 0f data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 400489: 1f 84 00 […]
我正在检查GCC生成的预处理输出,我在使用-save-temps标志生成的.i文件中看到了很多这些: # 8 “/usr/include/i386-linux-gnu/gnu/stubs.h” 2 3 4 stubs.h的绝对路径之前和之后的数字是什么意思? 它似乎是由预处理器插入的某种调试信息,并允许编译器发出引用此信息的错误消息。 这些行不会影响程序本身,但每个数字具体是什么?
我正在用C编程语言编写UDP客户端服务器应用程序; 我想在依赖项发生变化时自动编译2个源文件和3个头文件,所以我决定使用make实用程序。 makefile目标称为“编辑” : edit : server_UDP.o client_UDP.o \ gcc -o edit server_UDP.o client_UDP.o \ client_UDP.o : client_UDP.c cliHeader_UDP.h wrapHeader.h gcc -c client_UDP.c server_UDP.o : server_UDP.c servHeader_UDP.h wrapHeader.h gcc -c server_UDP.c 当我在wrapHeader.h中更改几行代码时,它不会触发重新编译。 当wrapHeader.h中有更改以重新编译server_UDP和client_UDP时,如何修改编辑makefile规则? **注意 :wrapHeader.h是主标题 cliHeader_UDP.h:包含“wrapHeader.h” servHeader_UDP.h:包含“wrapHeader.h”
我有一些代码,我想在一台我没有root权限的机器上运行。 该机器没有运行此代码所需的一些库。 在编译时有没有办法包含所有依赖项? 我意识到结果文件可能非常大。
这是我的简单代码…… #include int main() { int i=5; printf(“%d %d %d %d %d “,i++,i–,++i,–i,i); return 0; } 在gcc上,它输出为“4 5 5 5 5” 但在TC上,它输出为’4 5 5 4 5′ 我知道在printf语句中,如果是单个表达式,则评估将从左到右,但在正常语句中,它将从左到右。 但是如果printf包含多个表达式,那么评估将在堆栈上,元素将从左到右推入堆栈,但从右到左弹出,这certificateTC输出是正确的 请纠正我在哪里错了???
我正在按照本教程关于assembly。 根据教程(我也在本地尝试,并得到类似的结果),以下源代码: int natural_generator() { int a = 1; static int b = -1; b += 1; /* (1, 2) */ return a + b; } 编译到这些汇编指令: $ gdb static (gdb) break natural_generator (gdb) run (gdb) disassemble Dump of assembler code for function natural_generator: push %rbp mov %rsp,%rbp movl $0x1,-0x4(%rbp) mov 0x177(%rip),%eax # (1) add […]
例如,有来源: void my_special_debugging_function(const char* function_name, const char* file_name, int line_number); void func1() { func3(); func4(); } void foo() { func1(); if(qqq) { func2(); }; func3(); func4(); for(…) { func5(); } } 它应编译为: void my_special_debugging_function(const char* function_name, const char* file_name, int line_number); void func1() { my_special_debugging_function(“func1”, “prog.c”, 3); func3(); my_special_debugging_function(“func1”, “prog.c”, 4); func4(); my_special_debugging_function(“func1”, “prog.c”, 5); […]