有没有可能把#ifndef放在c文件的顶部?基本上,我需要检查在运行程序时是否声明了某个预处理器常量,我的程序将相应地更改。
我需要检查-D DESCENDING_ORDER=1是否被添加为参数(与给定的值无关)。
我在我的主c文件的顶部有这段代码:
#ifndef DESCENDING_ORDER
int ascending = 1;
#else
int ascending = 0;
#endif当我尝试使用Makefile进行编译时,我得到了一些错误,类似于“int ascending = 1的'int‘之前的期望标识符”。
谢谢。
编辑-添加的Makefile代码
CC=gcc
CFLAGS=-g -Wall
INC=-include
RES_OBS=res.o
LIBS=
all: res
res: $(RES_OBS)
$(CC) $(CFLAGS) -o res $(RES_OBS) $(LIBS) $(INC) res.h -D DESCENDING_ORDER=1
clean:
rm -f *.o
clobber:
make clean
rm -f res我猜到了,并在命令的末尾添加了$(INC)....DESCENDING_ORDER=1,所以这可能就是它不能工作的原因。我在没有makefile的情况下使用的命令:
gcc res -include res.h -D DESCENDING_ORDER=1编辑2-使用了不同的参数,发现如果我在命令中删除-include res.h,我会得到相同的错误。还不确定如何正确引用makefile中的头文件吗?我已经在我的res.c文件中添加了#include "res.h",但仍然收到错误。
发布于 2013-03-23 16:10:38
您的Makefile中有一个拼写错误,因为$(CLAGS)应该是$(CFLAGS)。了解更多关于make的知识,特别是通过运行make -p,它向您展示了make的许多内置规则并使用它们(例如,考虑使用$(COMPILE.c)和$(LINK.c)等)。
不要忘记将-Wall添加到您的CFLAGS中,因为您需要来自编译器的所有警告。您可能也需要调试信息,因此还要添加g。
在Linux上,我确实推荐通过运行remake -x来使用remake来调试Makefile-s,这很有帮助。
标准实践包括:
不要忘记,gcc的程序参数顺序非常重要。
附录
您可能希望使用gcc -C -E生成源代码res.c的预处理后的表单res.i,并且可以使用如下规则
res.i: res.c res.h
$(CC) -C -E $(CFLAGS) $(CPPFLAGS) $^ -o $@然后执行make res.i并使用某个编辑器或分页程序(可能是less)检查预处理器输出res.i;或者,在命令行上执行此操作
gcc -C -E -I. -DDESCENDING_ORDER=1 res.c | less您可以删除生成的行信息并执行以下操作
gcc -C -E -I. -DDESCENDING_ORDER=1 res.c | grep -v '^#' > res_.i
gcc -Wall -c res_.i关键是C中的预处理是一个文本操作,而预处理后的形式是错误的。
顺便说一句,最近的Clang/LLVM (3.2版)或GCC (刚刚发布的4.8版)编译器为你提供了更好的预处理信息。
发布于 2013-03-23 15:46:03
代码没问题。使用Makefile时出现的错误与其他事情有关(如果看不到#ifndef之前的内容和Makefile,就很难确定)。
https://stackoverflow.com/questions/15584520
复制相似问题