【发布时间】:2025-12-10 17:35:01
【问题描述】:
更新原来我的讲师会接受按照 GNU99 标准编写的代码,因此,正如 User1 所指出的,我在程序开始时使用了_GNU_SOURCE。 (请参阅man feature_test_macros 了解更多信息。)感谢您帮助我理解!
在带有 Clang 3.4、GCC 4.8.1 的 Ubuntu 13.10 上,我正在执行一项要求我使用 C99 标准的作业。 (我也从 SVN 安装了 GNUstep)
WRT GCC,我想我在这些文件夹中安装了 4 个版本:
/usr/lib/gcc/x86_64-linux-gnu/4.7
/usr/lib/gcc/x86_64-linux-gnu/4.7.3
/usr/lib/gcc/x86_64-linux-gnu/4.8
/usr/lib/gcc/x86_64-linux-gnu/4.8.1
gcc --version 报告 4.8.1,clang --version 报告 3.4。 ld -v 报告 2.23.52.20130913
我正在编写一个信号处理程序,当我在函数头中使用 siginfo_t 时,出现编译器错误:unknown type name 'siginfo_t' 我正在使用 sigaction() 来安装处理程序。
在研究需要做什么以及如何做时,我能够编译一个简单的演示,它也使用相同的函数头定义,并且它可以工作。但是它不限于 C99。
这些是我的包含(其中 signal.h 是其中之一):
#define _POSIX_C_SOURCE 2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <math.h>
#include <ctype.h>
#include <libgen.h>
#include <signal.h>
这是我的信号处理函数(仅用于调试目的):
static void sigSIGCHLDhandler(int sigNum, siginfo_t *siginfo, void *context) {
printf("PID = %ld",(long) siginfo->si_pid);
}
我现在使用-Wall 和 与-std=c99clang 一起编译-std=gnu99options。
我已经尝试过locate signal.h,我在/usr/include 中有它。我尝试添加 #include <bits/siginfo.h> 并允许我编译,但二进制文件无法正常工作。
(我的系统上有一堆 signal.h 和 siginfo.h 文件。)
另一位学生建议我的设置有问题。所以我重新安装了 Clang。以下是我认为可能相关的一些环境变量(如有任何遗漏或错误,请通知我)
LD_LIBRARY_PATH=/home/user/ros_catkin_ws/install_isolated/lib:/home/user/GNUstep/Library/Libraries:/usr/local/lib
CPATH=/home/user/ros_catkin_ws/install_isolated/include
PATH=/home/user/ros_catkin_ws/install_isolated/bin:/home/user/GNUstep/Tools:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/user/bin:/usr/local/java/jdk1.7.0_51/bin
CLASSPATH=/home/user/GNUstep/Library/Libraries/Java:/usr/local/lib/GNUstep/Libraries/Java
LIBRARY_COMBO=gnu-gnu-gnu
INFOPATH=/usr/local/share/info::/home/user/GNUstep/Library/Documentation/info:
GNUSTEP_IS_FLATTENED=yes
GNUSTEP_LOCAL_ROOT=/usr/local/Local
GNUSTEP_HOST=x86_64-unknown-linux-gnu
GUILE_LOAD_PATH=/home/user/GNUstep/Library/Libraries/Guile:/usr/local/lib/GNUstep/Libraries/Guile
GNUSTEP_MAKEFILES=/usr/local/share/GNUstep/Makefiles
GNUSTEP_NETWORK_ROOT=/usr/local/Network
GNUSTEP_FLATTENED=yes
GNUSTEP_HOST_OS=linux-gnu
GNUSTEP_HOST_VENDOR=unknown
GNUSTEP_HOST_CPU=x86_64
GNUSTEP_USER_ROOT=/home/user/GNUstep
GNUSTEP_SYSTEM_ROOT=/usr/local/System
GNUSTEP_PATHLIST=/usr/local/System:/usr/local/Network:/usr/local/Local:/home/user/GNUstep
GNUSTEP_SYSTEM_ROOT=/usr/local/System
GNUSTEP_PATHLIST=/usr/local/System:/usr/local/Network:/usr/local/Local:/home/nap/GNUstep
我花了几个小时寻找修复程序,但找不到任何东西,而且我没有想法。 什么坏了?
【问题讨论】:
-
C 标准中没有称为 siginfo 或 signinfo_t 的内容。因此,您的问题与 C99 本身无关。我对这些库知之甚少,但似乎 siginfo.h 是一些非标准库。
-
好的。在手册页中,功能测试宏是:
sigaction(): _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE和siginfo_t: _POSIX_C_SOURCE >= 199309L。那么,您的意思是,尽管 C99 标准出现在这两者之后,但它不包括 POSIX?我目前正在阅读 Wiki,以了解不同标准之间的关系,并希望对此有更多了解。 (这已经让我发疯了一段时间了。) -
C 标准确实不知道/不关心 POSIX。 C 甚至不需要操作系统。
-
我遇到了类似的问题,将
-std=c99更改为-std=gnu99修复了一些问题。谢谢。