- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
最近有一篇关于 Ask Ubuntu 的帖子,OP 试图编译一个包含 term.h
的程序.当代码有 #include <term.h>
,错误是:
In file included from clear_screen_UNIX.c:5:0:
clear_screen_UNIX.c:9:6: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘->’ token
void clear_screen(void) {
^
clear_screen_UNIX.c: In function ‘main’:
clear_screen_UNIX.c:23:14: error: called object is not a function or function pointer
clear_screen();
^
clear_screen_UNIX.c:26:14: error: called object is not a function or function pointer
clear_screen();
然后 OP 包含了到 term.h
的完整路径( #include "/usr/include/term.h"
),这导致了更有用的消息:
In file included from clear_screen_UNIX.c:7:0:
/usr/include/term.h:125:21: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘->’ token
#define CUR cur_term->type.
^
/usr/include/term.h:202:40: note: in expansion of macro ‘CUR’
#define clear_screen CUR Strings[5]
^
clear_screen_UNIX.c:9:6: note: in expansion of macro ‘clear_screen’
void clear_screen(void) {
^
clear_screen_UNIX.c: In function ‘main’:
clear_screen_UNIX.c:23:14: error: called object is not a function or function pointer
clear_screen();
^
clear_screen_UNIX.c:26:14: error: called object is not a function or function pointer
clear_screen();
这些消息清楚地表明问题是由于宏扩展引起的。
我自己也验证了结果。我想知道为什么 GCC 在给出完整路径时会产生更好的错误。我可以让它生成与系统包含语法相似的消息吗?
我使用的是 GCC 4.9.2,我怀疑 OP 使用的是 GCC 4.8.2(考虑到 Ubuntu 的版本)。
最佳答案
如果给出 header 的完整路径,GCC 会给出不同/更好消息的原因是 GCC 预处理器将信息提供给 GCC 的 cc1
。预处理器生成的 .i
的注释行末尾的一些数字表明包含的头文件是系统头文件或本地头文件。文件。
然后 cc1
根据 GCC documentation,如果头文件是本地头文件,编译器将生成更多有用的消息,如果头文件是系统头文件,编译器将抑制一些错误消息。 .
要使正常版本的代码输出错误消息就像指定头文件完整路径的代码一样,正如您所要求的,GCC 需要通过指定选项 -nostdinc
来停止包含所有系统目录。 , 然后使用 -I
显式告诉 GCC 它可以搜索头文件的目录而不将该目录视为系统目录旗帜。
对于您的代码,命令行可能如下所示(GCC_INCLUDE_DIR
是您的默认 GCC 包含目录,对于系统默认 GCC,它可能是 /usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/include/
):
gcc -c t.c -nostdinc -I/usr/include/ -IGCC_INCLUDE_DIR
将源代码从 this original post 移至此处使这个答案更有帮助。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <term.h>
//#include "/usr/include/term.h"
void clear_screen(void) {
if (!cur_term) {
int result;
setupterm( NULL, STDOUT_FILENO, &result );
if (result <= 0)
return;
}
putp( tigetstr( "clear" ) );
}
int main(void) {
puts("I am going to clear the screen");
sleep(1);
clear_screen();
puts("Screen Cleared");
sleep(1);
clear_screen();
return 0;
}
您可以使用以下命令行要求 GCC 输出预处理器生成的代码。此代码将被输入到 GCC 的实际编译器中,cc1
.如果预处理器生成的文件完全相同,则 cc1
编译器的行为应该完全相同。 (假设代码被放入文件 t.c
)
gcc -E t.c -o t.i
以下是两个gcc预处理器生成的区别.i
文件。 t.fullpath.i
是用全路径头文件生成的文件,而t.i
是没有完整路径的代码(一些 diff
输出已被删除,因为它们只是文件名差异。)
$ diff t.i t.fullpath.i
2920,2922c2920,2924
< # 1 "/usr/include/term.h" 1 3 4
< # 47 "/usr/include/term.h" 3 4
---
> # 1 "/usr/include/term.h" 1
> # 47 "/usr/include/term.h"
2924,2925c2926,2927
< # 48 "/usr/include/term.h" 2 3 4
< # 80 "/usr/include/term.h" 3 4
---
> # 48 "/usr/include/term.h" 2
> # 80 "/usr/include/term.h"
3007,3008c3009,3010
< # 81 "/usr/include/term.h" 2 3 4
< # 673 "/usr/include/term.h" 3 4
---
> # 81 "/usr/include/term.h" 2
> # 673 "/usr/include/term.h"
3041c3043
< # 729 "/usr/include/term.h" 3 4
---
> # 729 "/usr/include/term.h"
预处理器生成的代码注释中的不同标志会有所不同
海湾合作委员会的 cc1
编译器将利用预处理器生成的信息生成错误信息的源代码位置,以及将来用于 gdb 的调试信息。
对于以下格式:
# line-number "source-file" [flags]
数字3
和 4
标志的含义:
#include <>
与 #include ""
)4:以下文本应被视为包含在隐式 extern "C"
中 block 。
有关这些标志的不同种类的更多信息,请参阅 this link .
因此,对于没有完全指定路径的代码,cc1
编译器会把它当作一个系统头文件,并假定系统代码大部分是正确的,然后只输出用户代码的错误信息。这就是错误消息较短的原因。
关于c - 为什么包含使用完整路径的 header 会导致更好的错误消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29736949/
BufferedImage image = ImageIO.read(SpriteSheet.class.getResource(path)); BufferedImage image = Image
希望有人能够帮助我解决将我的 React 应用程序推送到 Heroku 时遇到的问题。 heroku 日志反复显示以下错误。 at=error code=H10 desc="App crashed"
我是 Kotlin 的新手,我正在经历这样的例子。 . . package com.example.lambda1 import spark.Spark.get fun main(args: Arra
如果您已经安装了 32 位 JDK,请在中定义一个 JAVA_HOME 变量 Computer>System Properties>System Setting>Enviorment VAriable
我正在开发一个独立于平台的应用程序。我收到一个文件 URL*。在 Windows 上,这些是: file:///Z:/folder%20to%20file/file.txt file://host/f
我在 OSX、Objective-C 上。 我有一个像 这样的路径/NSURL /Users/xxx/Desktop/image2.png 但我将它传递给第三方应用程序,该应用程序会像 excpect
我已经安装了 Android studio 和插件的 DART,FLUTTER 来启动 flutter,但是因为我在创建我的第一个 flutter 项目时无法提供 sdk 路径。 最佳答案 我试图找出
127.0.0.1:8000/api/仅包含来自第二个应用程序的 url,但我将两个 url 模块链接到相同的模式。甚至有可能做到这一点吗? 第一个应用程序: from django.urls imp
对于大量图像(大约 1k,加上相同数量的拇指,在大约 500 个文件夹中),我们要求网站上使用的所有图像 URI 都必须具有 SEO 优化路径。它们已经准备好并提供完整的路径结构(每个文件夹包含一个具
为什么 f 不是一个文件?什么可能导致这种情况? String currentPhotoPath = "file:/storage/sdcard0/Pictures/someFileName.
Gradle 中的项目名称或路径中允许使用哪些字符? 它是否与特定操作系统的目录名称中允许的字符相同(例如: http://en.wikipedia.org/wiki/Filename#Reserve
我有一个包含文件夹路径的表格。我需要找到层次结构中这些文件夹之间的所有“差距”。我的意思是,如果表格包含这 3 个文件夹: 'A' 'A\B\C' 'A\B\C\D\E\F\G' 我需要在层次结构中找
我在 Linux 服务器上的/home/subversion 中安装了 svn - 那里有一个 ROOT 文件夹,其中包含 db 和 conf 等文件夹。没有映射到项目名称的文件夹,请有人告诉我如何列
对于我的图像位置:/src/assets/bitmap/sample.jpg 给出了关键配置: context: resolve('src') output: { path: resolve('b
我需要创建带有圆角的 SVG 路径,以将它们导出到 DXF 进行切割。我的问题是角应该是圆弧,而不是贝塞尔曲线。 使用 arc 命令相对容易处理直角,因为半径也是从拐角到圆弧起点的距离。对于其他角度,
大家好,我正在玩 Airflow,我正在阅读这篇很有帮助的 tutorial .我正在寻求帮助以更好地了解 Admin->Connection 如何在 Conn Type: File (path) 方
我的目标是定义R将用于安装和搜索库的单个路径。我read可以通过更改Rprofile.site安装路径中的R文件来完成。我在那里尝试了两个命令: .libPaths("D:/RLibrary") .L
我有一个问题:当我在一个页面中时,我想返回到上一页。我使用 $routeProvider。如何读取之前的 url? 我尝试在我的 Controller 中使用此代码但不起作用... angular.m
我正在尝试将一个文件从我的主干合并到一个分支(wc),并且对于看起来位于当前合并操作中不涉及的分支上的路径出现奇怪的未找到路径错误。 例如,在我们的 svn 项目中,我们有: 分行 分支 0 分支 1
我有一个树数据序列化如下: 关系:P到C是“一对多”,C到P是“一对一”。所以列 P 可能有重复的值,但列 C 有唯一的值。 P, C 1, 2 1, 3 3, 4 2, 5 4, 6 # in da
我是一名优秀的程序员,十分优秀!