首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >#ifndef在c文件中?

#ifndef在c文件中?
EN

Stack Overflow用户
提问于 2013-03-23 15:43:54
回答 2查看 1.2K关注 0票数 2

有没有可能把#ifndef放在c文件的顶部?基本上,我需要检查在运行程序时是否声明了某个预处理器常量,我的程序将相应地更改。

我需要检查-D DESCENDING_ORDER=1是否被添加为参数(与给定的值无关)。

我在我的主c文件的顶部有这段代码:

代码语言:javascript
复制
#ifndef DESCENDING_ORDER
int ascending = 1;
#else
int ascending = 0;
#endif

当我尝试使用Makefile进行编译时,我得到了一些错误,类似于“int ascending = 1的'int‘之前的期望标识符”。

谢谢。

编辑-添加的Makefile代码

代码语言:javascript
复制
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的情况下使用的命令:

代码语言:javascript
复制
gcc res -include res.h -D DESCENDING_ORDER=1

编辑2-使用了不同的参数,发现如果我在命令中删除-include res.h,我会得到相同的错误。还不确定如何正确引用makefile中的头文件吗?我已经在我的res.c文件中添加了#include "res.h",但仍然收到错误。

EN

回答 2

Stack Overflow用户

发布于 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,并且可以使用如下规则

代码语言:javascript
复制
  res.i: res.c res.h
           $(CC) -C -E $(CFLAGS) $(CPPFLAGS) $^ -o $@

然后执行make res.i并使用某个编辑器或分页程序(可能是less)检查预处理器输出res.i;或者,在命令行上执行此操作

代码语言:javascript
复制
  gcc -C -E -I. -DDESCENDING_ORDER=1  res.c | less

您可以删除生成的行信息并执行以下操作

代码语言:javascript
复制
  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版)编译器为你提供了更好的预处理信息。

票数 3
EN

Stack Overflow用户

发布于 2013-03-23 15:46:03

代码没问题。使用Makefile时出现的错误与其他事情有关(如果看不到#ifndef之前的内容和Makefile,就很难确定)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15584520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档