我试图在结构内创建一个函数,到目前为止我有这个代码:
typedef struct client_t client_t, *pno;
struct client_t
{
pid_t pid;
char password[TAM_MAX]; // -> 50 chars
pno next;
pno AddClient()
{
/* code */
}
};
int main()
{
client_t client;
//code ..
client.AddClient();
}
Run Code Online (Sandbox Code Playgroud)
错误:client.h:24:2:错误:在'{'标记之前预期':',',',';','}'或' attribute '.
这是正确的方法吗?
在C11中,有一个关键字_Noreturn,它是一个函数说明符(如inlineis),表示函数不返回 - 它调用exit()或等效.还有一个标题,<stdnoreturn.h>完整的定义是:
7.23
_Noreturn <stdnoreturn.h>1标题
<stdnoreturn.h>定义宏Run Code Online (Sandbox Code Playgroud)noreturn扩展到
_Noreturn.
在GNU C(GCC)中,有一个属性__attribute__((noreturn))基本上完成相同的工作.一个区别是__attribute__((noreturn))可以出现在函数声明符之前或之后:
extern __attribute__((noreturn)) void err_error(const char *format, ...);
extern void err_error(const char *format, ...) __attribute__((noreturn));
Run Code Online (Sandbox Code Playgroud)
问题在于,如果<stdnoreturn.h>在转换单元(TU)中包含任何后续使用的__attribute__((noreturn))get映射__attribute__((_Noreturn)),则会导致编译失败,因为_Noreturn无法识别该属性(即使关键字被识别为关键字).也就是说,据我所知,你不能同时使用这两个系统.
有没有办法解决这个问题,除了:
<stdnoreturn.h>,或_Noreturn关键字?您可以通过测试检测C11 __STDC_VERSION__ >= 201112L- 该值由技术勘误1指定,因为标准意外地保留了未完全指定的值:
__STDC_VERSION__整数常数201ymmL.178)178)该宏未在ISO/IEC 9899:1990中规定,在ISO/IEC 9899:1990/Amd.1:1995中指定为199409L,在ISO/IEC 9899:1999中指定为199901L.目的是这将保持一个整数常数,
long int随着本国际标准的每次修订而增加.
这可以用来调整任何一个头文件中的处理,但是如果你有混合的修改和未修改(C11和C99)头文件,我似乎遇到了棘手的问题<stdnoreturn.h>.