Tag: compiler construction

隐含的function声明

当未包含正确的头文件时,GCC通常会产生此警告。 此链接 – > www.network-theory.co.uk/docs/gccintro/gccintro_19.html表示因为函数声明是隐式的(而不是通过标头显式声明),错误的参数类型实际上可以传递给函数,产生不正确的结果。 我不明白这一点。 这是否意味着编译器生成的代码将机器的字大小推送到堆栈上以供被调用者使用,并希望最好? 细节表示赞赏。

gcc:未定义的参考错误

我想使用ffmpeg / libavfilter / lavfutils.h中定义的函数’ff_load_image’。 program.c #include “../ffmpeg/libavfilter/lavfutils.h” int main () { uint8_t* data; int linesize, width, height, log_ctx; int i = ff_load_image(&data, &linesize, &width, &height, AV_PIX_FMT_RGB24, “blue.jpg”, &log_ctx); } 运行 gcc -I$HOME/ffmpeg/include program.c -L$HOME/ffmpeg/lib -lavfilter -lavcodec -lavutil 给出未定义的引用错误。 program.c: In function \u2018main\u2019: program.c:9: warning: passing argument 1 of \u2018ff_load_image\u2019 from incompatible pointer type ../ffmpeg/libavfilter/lavfutils.h:39: […]

在无限循环之前不会打印Print语句

在尝试调试一些C代码时,我注意到如果置于无限循环之前,printf()将不会执行。 有人知道为什么吗? 实际上它不是那么大的交易,但对于调试来说这是一场噩梦。 #include int main() { int data; printf(“This prints fine.\n”); printf(“Enter data: “); scanf(“%d”, &data); printf(“This should print but it doesn’t.\n”); while(1) { //Infinite Loop } return 0; }

如何根据编译器类型在SConstruct for C编译器中设置选项?

我需要为C编译器设置其他选项,例如添加标志以打开所有警告,具体取决于编译器的类型。 例如,我应该使用MSVC env.Append(CPPFLAGS = “/Wall”) 但对于mingw(gcc)我需要使用: env.Append(CCFLAGS = “-Wall”) 我怎样才能以scons的方式做到这一点?

Libclang API用于获取在不同文件中定义的函数定义

假设我有两个文件main.c和func.c func.c是从main.c的main函数调用的。 通常,我会生成main.o和func.o,链接器会找到func的定义并将其绑定到main .c中的调用。 现在,我想通过libclang API做同样的事情。 这是我正在制作的Doxygen类型代码浏览实用程序。 我能够解析这两个文件。 从这里开始,我不知道如何继续。 我应该生成* .o文件并让clang链接吗? 谢谢,我希望我能清楚地提出这个问题

在C中表示抽象语法树

我正在C中为一个简单的玩具语言实现一个编译器。我有一个工作的扫描器和解析器,以及AST的概念function/构造的合理背景。 我的问题与在C中表示AST的具体方式有关。我在网上不同的文本/资源中经常遇到三种风格: 每种节点一个结构。 它有一个基节点“class”(struct),它是所有子结构中的第一个字段。 基节点包含一个存储节点类型的枚举(常量,二元运算符,赋值等)。 使用一组宏访问结构的成员,每个结构一个集。 它看起来像这样: struct ast_node_base { enum {CONSTANT, ADD, SUB, ASSIGNMENT} class; }; struct ast_node_constant { struct ast_node_base *base; int value; }; struct ast_node_add { struct ast_node_base *base; struct ast_node_base *left; struct ast_node_base *right; }; struct ast_node_assign { struct ast_node_base *base; struct ast_node_base *left; struct ast_node_base *right; }; #define CLASS(node) ((ast_node_base*)node)->class; […]

任何将’char’作为’unsigned’的编译器?

除非用户在文件或项目设置中明确提到,否则是否有任何C编译器将默认类型的char作为unsigned? / Kanu_

推荐保留预处理器指令的C前端

我想开始一个涉及转换C代码的项目,但我想要包含预处理器指令。 我不想通过编写自己的C解析器重新发明轮子,所以有人知道可以解析C预处理器和C代码的前端,并产生一个可以用来重新生成的AST(或者漂亮的 -打印)原始来源? 例如,: #define FILENAME “filename” #include FILE *f=0; … if (file_is_open) { #ifdef CAN_OPEN_IT f = fopen(FILENAME, “r”); #else printf(“Unable to open file.\n”); #endif } 应将上述代码解析为一些可用于重新生成源的内存中表示。 换句话说,它不应该在两个阶段中作为普通C处理,首先处理PP指令然后解析纯C代码。 相反,它应该代表整个编译时逻辑,包括预处理器变量。

如何在Sublime Text 2 上运行和编译.c

我现在在大学学习C,老师告诉我使用代码块作为IDE,但在我看来,代码块有点难看,这就是为什么我选择Sublime Text 2,那里最好的IDE /文本编辑器。 目前我通过sublime编写我的代码,保存它然后通过mac os终端(gcc)编译它,然后在终端上运行它… 我想知道的是,如果它是可能的,是如何从sublime,使用它的控制台或插件(或其他东西),换句话说我想知道是否可以编译我的.c并运行只需点击几下即可获得…(现在我只是构建控制台应用程序) 我在这里读到了一些关于这个主题的post,但没有一个能帮助我解决这个问题。

链接Bool值给出了预期的相反结果

我不假思索地编写了一些代码来检查结构的所有值是否都设置为0.为了实现这一点,我使用了: bool IsValid() { return !(0 == year == month == day == hour == minute == second); } 其中所有struct成员都是unsigned short类型。 我使用代码作为更大测试的一部分,但注意到它对于不等于零的值返回false,对于全部等于零的值则返回true – 与我预期的相反。 我将代码更改为: bool IsValid() { return (0 != year) || (0 != month) || (0 != day) || (0 != hour) || (0 != minute) || (0 != second); } 但是想知道是什么导致了奇怪的行为。 这是优先的结果吗? […]