c语言 - 进行条件编译时出错



[在此处输入链接描述][1]我正在编写这个程序,它将启用条件编译。

当程序以这样的标准方式编译时,它可以正常工作,没有任何错误消息:

gcc -Werror -Wall -pedantic -ansi -g -c display.c -o displayStack 

但是当我想使用条件编译进行编译时,我收到一条错误消息,指出在 display.c 中隐式声明了我的函数

这是我如何编译它:

gcc -Werror -Wall -pedantic -ansi -g -c display.c -o displayStack -D STACK

以下是我在代码中编写条件命令的方式:

#ifdef STACK
printLinkedList( stack );
#endif

这是显示包含LinkedList.hstack.h文件,其中包含printLinkedList的功能原型。

#ifndef STACK
#define STACK
#include "LinkedList.h"
LinkedList *createStack();
void push( LinkedList *, void * );
void *top( LinkedList * );
void *pop( LinkedList * );
void freeStack( LinkedList * );
#endif

我可以知道这里有任何问题吗?我似乎找不到问题,因为第一条语句运行良好,但是当我添加"-D STACK"时,程序只会显示错误消息。我的编译命令有问题吗?

我收到的错误消息:

display.c: In function ‘display’:
display.c:21:5: error: unknown type name ‘LinkedList’
21 |     LinkedList *stack = NULL;
|     ^~~~~~~~~~
display.c:22:13: error: implicit declaration of function ‘createStack’ [-Werror=implicit-function-declaration]
22 |     stack = createStack();
|             ^~~~~~~~~~~
display.c:22:11: error: assignment to ‘int *’ from ‘int’ makes pointer from integer without a cast [-Werror=int-conversion]
22 |     stack = createStack();
|           ^
display.c:47:21: error: implicit declaration of function ‘push’ [-Werror=implicit-function-declaration]
47 |                     push( stack, bracket );
|                     ^~~~
display.c:52:30: error: request for member ‘head’ in something not a structure or union
52 |                     if( stack->head != NULL )
|                              ^~
display.c:54:38: error: implicit declaration of function ‘top’ [-Werror=implicit-function-declaration]
54 |                         popBracket = top( stack );
|                                      ^~~
display.c:54:36: error: assignment to ‘char *’ from ‘int’ makes pointer from integer without a cast [-Werror=int-conversion]
54 |                         popBracket = top( stack );
|                                    ^
display.c:72:42: error: implicit declaration of function ‘pop’ [-Werror=implicit-function-declaration]
72 |                             popBracket = pop( stack );
|                                          ^~~
display.c:72:40: error: assignment to ‘char *’ from ‘int’ makes pointer from integer without a cast [-Werror=int-conversion]
72 |                             popBracket = pop( stack );
|                                        ^
display.c:108:17: error: implicit declaration of function ‘printLinkedList’ [-Werror=implicit-function-declaration]
108 |                 printLinkedList( stack );
|                 ^~~~~~~~~~~~~~~
display.c:147:22: error: request for member ‘head’ in something not a structure or union
147 |             if( stack->head == NULL )   /* Good case */
|                      ^~
display.c:151:28: error: assignment to ‘char *’ from ‘int’ makes pointer from integer without a cast [-Werror=int-conversion]
151 |                 popBracket = top( stack );
|                            ^
display.c:164:5: error: implicit declaration of function ‘freeStack’ [-Werror=implicit-function-declaration]
164 |     freeStack( stack );
|     ^~~~~~~~~
cc1: all warnings being treated as errors
calmen@calmen:~/Desktop/Project/BracketCheck$ vim display.h
calmen@calmen:~/Desktop/Project/BracketCheck$ gcc -Werror -Wall -pedantic -ansi -g -c display.c -o displayStack -D STACK
display.c: In function ‘display’:
display.c:21:5: error: unknown type name ‘LinkedList’
21 |     LinkedList *stack = NULL;
|     ^~~~~~~~~~
display.c:22:13: error: implicit declaration of function ‘createStack’ [-Werror=implicit-function-declaration]
22 |     stack = createStack();
|             ^~~~~~~~~~~
display.c:22:11: error: assignment to ‘int *’ from ‘int’ makes pointer from integer without a cast [-Werror=int-conversion]
22 |     stack = createStack();
|           ^
display.c:47:21: error: implicit declaration of function ‘push’ [-Werror=implicit-function-declaration]
47 |                     push( stack, bracket );
|                     ^~~~
display.c:52:30: error: request for member ‘head’ in something not a structure or union
52 |                     if( stack->head != NULL )
|                              ^~
display.c:54:38: error: implicit declaration of function ‘top’ [-Werror=implicit-function-declaration]
54 |                         popBracket = top( stack );
|                                      ^~~
display.c:54:36: error: assignment to ‘char *’ from ‘int’ makes pointer from integer without a cast [-Werror=int-conversion]
54 |                         popBracket = top( stack );
|                                    ^
display.c:72:42: error: implicit declaration of function ‘pop’ [-Werror=implicit-function-declaration]
72 |                             popBracket = pop( stack );
|                                          ^~~
display.c:72:40: error: assignment to ‘char *’ from ‘int’ makes pointer from integer without a cast [-Werror=int-conversion]
72 |                             popBracket = pop( stack );
|                                        ^
display.c:108:17: error: implicit declaration of function ‘printLinkedList’ [-Werror=implicit-function-declaration]
108 |                 printLinkedList( stack );
|                 ^~~~~~~~~~~~~~~
display.c:147:22: error: request for member ‘head’ in something not a structure or union
147 |             if( stack->head == NULL )   /* Good case */
|                      ^~
display.c:151:28: error: assignment to ‘char *’ from ‘int’ makes pointer from integer without a cast [-Werror=int-conversion]
151 |                 popBracket = top( stack );
|                            ^
display.c:164:5: error: implicit declaration of function ‘freeStack’ [-Werror=implicit-function-declaration]
164 |     freeStack( stack );
|     ^~~~~~~~~
cc1: all warnings being treated as errors

这些文件可以在此处的文件夹中找到。 [1]: https://github.com/Calmen00-code/BracketCheck

问题是stack.h文件中的包含保护:

#ifndef STACK

然后,在命令行上定义STACK时,该条件变为 FALSE,并且不包括标头内容。这会导致 C 文件中缺少原型。

要解决此问题,您需要更改 C 文件或头文件以使用不同的预处理器变量。

gcc -Werror -Wall -pedantic -ansi -g -c display.c -o displayStack -D STACK

很奇怪。我会删除-DSTACK之间的空格

您可能有兴趣将-Wextra -fanalyze添加到gcc命令中。阅读有关调用 GCC 的章节、有关静态分析器选项的部分,并在 2020 年底考虑升级到 GCC 10。

此外,-ansi指的是旧的 C 标准。阅读 n1570 和现代 C,然后考虑使用-std=c11

当编译你的代码BracketCheck.tar.gz(md5sum1b81b34f26db85fef69bda62a5bd4e63)时,我得到make CFLAGS='-Wall -Wextra -g -std=c11'

display.c: In function ‘display’:
display.c:21:5: error: unknown type name ‘LinkedList’
21 |     LinkedList *stack = NULL;
|     ^~~~~~~~~~
display.c:22:13: warning: implicit declaration of function ‘createStack’ [-Wimplicit-function-declaration]
22 |     stack = createStack();
|             ^~~~~~~~~~~
display.c:22:11: warning: assignment to ‘int *’ from ‘int’ makes pointer from integer without a cast [-Wint-conversion]
22 |     stack = createStack();
|           ^
display.c:47:21: warning: implicit declaration of function ‘push’ [-Wimplicit-function-declaration]
47 |                     push( stack, bracket );
|                     ^~~~
display.c:52:30: error: request for member ‘head’ in something not a structure or union
52 |                     if( stack->head != NULL )
|                              ^~
display.c:54:38: warning: implicit declaration of function ‘top’ [-Wimplicit-function-declaration]
54 |                         popBracket = top( stack );
|                                      ^~~
display.c:54:36: warning: assignment to ‘char *’ from ‘int’ makes pointer from integer without a cast [-Wint-conversion]
54 |                         popBracket = top( stack );
|                                    ^
display.c:72:42: warning: implicit declaration of function ‘pop’ [-Wimplicit-function-declaration]
72 |                             popBracket = pop( stack );
|                                          ^~~
display.c:72:40: warning: assignment to ‘char *’ from ‘int’ makes pointer from integer without a cast [-Wint-conversion]
72 |                             popBracket = pop( stack );
|                                        ^
display.c:108:17: warning: implicit declaration of function ‘printLinkedList’ [-Wimplicit-function-declaration]
108 |                 printLinkedList( stack );
|                 ^~~~~~~~~~~~~~~
display.c:147:22: error: request for member ‘head’ in something not a structure or union
147 |             if( stack->head == NULL )   /* Good case */
|                      ^~
display.c:151:28: warning: assignment to ‘char *’ from ‘int’ makes pointer from integer without a cast [-Wint-conversion]
151 |                 popBracket = top( stack );
|                            ^
display.c:164:5: warning: implicit declaration of function ‘freeStack’ [-Wimplicit-function-declaration]
164 |     freeStack( stack );

这是在带有GCC 10.2的Linux/x86-64/Ubuntu 20.04上。

我建议修复您的代码,直到您完全没有收到任何警告。

添加-DSTACK并不能修复所有错误。一旦它们都固定了,请使用 GDB 来了解程序的行为。

您可能会对这份报告草案以及资助它的解码器和战车项目感兴趣。

您也可以尝试在代码上使用 Frama-C 或 Clang 静态分析器。注意赖斯定理。

在阅读了Dragon这本书之后,你可以考虑使用GNU autoconf和/或GNU bison和/或ANTLR和/或GPP来生成一些代码(C,或你的makefile...)。

最新更新