是否可以将#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"
,但仍然收到错误。
最佳答案
您的Makefile
中存在拼写错误,因为$(CLAGS)
应该是$(CFLAGS)
。
了解有关 make
的更多信息,特别是通过运行 make -p
来了解 make
的许多内置规则并使用它们(例如考虑使用 $(COMPILE.c)
和 $(LINK.c)
等..)
不要忘记将 -Wall
添加到您的 CFLAGS
中,因为您需要来自编译器的所有警告。您可能还需要调试信息,因此还要添加 g
。
在 Linux 上,我建议使用 remake通过运行 remake -x
来调试 Makefile
-s,这很有帮助。
标准做法是:
避免将
-include
传递给gcc
,而是在相关内容的开头附近添加#include "res.h"
*.c
源文件将
-D
粘贴到定义的符号上,例如-DDESCENDING_ORDER=1
在
Makefile
中将相关目标文件的依赖项添加到新的#include
-d 文件res.h
中;请注意,这些依赖项可以自动生成(通过将-MD
传递给gcc
等)通过
CFLAGS
或更好的CPPFLAGS
传递-DDESCENDING_ORDER=1
不要忘记 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)编译器为您提供了有关预处理的更好的消息。
关于c - #ifndef 在 c 文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15584520/