c - #ifndef 在 c 文件中?

标签 c header c-preprocessor

是否可以将#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/

相关文章:

c - 找不到 MSVCR90.DLL

c++ - Visual Studio 2010 : Working with multiple C++ projects

c++ - 在C++中定义一个 'for'循环宏

c - GT540M 上的低性能 CUDA 代码

c - fseek 与倒带?

c++ - C++ 中包含的外部 header

c++ - 预处理器指令 conio.h c++

C++ #define 预处理器

c - 指数问题及其 C 表示

C++单函数变量放置