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
这是stack.h
显示包含的文件,LinkedList.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
解决方案
gcc -Werror -Wall -pedantic -ansi -g -c display.c -o displayStack -D STACK
很奇怪。我会删除和之间的-D
空间STACK
您可能会对添加-Wextra -fanalyze
到您的gcc
命令感兴趣。阅读关于调用 GCC的章节,关于静态分析器选项的部分,并在 2020 年底考虑升级到GCC 10。
此外,-ansi
指的是旧的 C 标准。阅读n1570和Modern C然后考虑使用-std=c11
编译您的代码BracketCheck.tar.gz
(的 md5sum 1b81b34f26db85fef69bda62a5bd4e63
)时,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 book之后,您可能会考虑使用GNU autoconf和/或GNU bison和/或ANTLR和/或GPP使用元编程技术生成一些代码(在 C 中,或您的makefile
...)。
推荐阅读
- flutter - 将按钮颜色更改为弯曲导航栏中选项卡上的主要颜色
- arrays - 如何组合字典中的重复键并快速总结值?
- android - 用于测试 SafetyNet 验证应用 API 的潜在有害应用程序示例
- javascript - 获取数据时单选按钮的Reactjs问题
- ruby-on-rails - 可以在加载 Rails 之前进行测试吗?
- android - 带有手势导航的错误小吃店位置
- image - 如何在python中保存没有框架的图像?
- node.js - 来自 lambda 的第一个请求未插入 DynamoDB 项目需要发出 4-5 个请求
- asp.net - 购物车 ASP.NET MVC 的数量
- html - 响应 DIV 大小的字体大小