- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 _Generic
制作线程安全的 strerror
函数,该函数与使用 strerror_r
的 XSI 或 GNU 变体无关. XSI 变体返回一个 int
并修改传递给它的缓冲区的内容,而 GNU 版本返回一个 char *
。
strerror.c
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include "strerror.h"
static inline char *strerror_r_gnu(int errnum, char *buf, size_t buflen);
static inline char *strerror_r_xsi(int errnum, char *buf, size_t buflen);
static inline char *strerror_r_gnu(int errnum, char *buf, size_t buflen) {
// FUNKY CASTING TO SILENCE COMPILER WARNING BELOW
return (char *)(intptr_t)strerror_r(errnum, buf, buflen);
}
static inline char *strerror_r_xsi(int errnum, char *buf, size_t buflen) {
// Cast result to int to shut up compiler when using GNU strerror()
int err = (int)strerror_r(errnum, buf, buflen);
if (err) {
snprintf(buf, buflen, "%s error", __func__);
// If your buffer can't fit this error message, you deserve truncation
buf[buflen-1] = '\0';
}
return buf;
}
char *strerror_p(int errnum, char *buf, size_t buflen) {
return _Generic(strerror_r,
int (*)(int, char *, size_t) : strerror_r_xsi(errnum, buf, buflen),
char * (*)(int, char *, size_t) : strerror_r_gnu(errnum, buf, buflen)
);
}
strerror.h
#ifndef STRERROR_H
#define STRERROR_H
char *strerror_p(int errnum, char *buf, size_t buflen);
#endif // STRERROR_H
main.c
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include "strerror.h"
int main(void){
const int buflen = 128;
char buf[buflen]; // Flawfinder: ignore
fprintf(stderr, "%s\n", strerror_p(EINVAL, buf, buflen));
return EXIT_SUCCESS;
}
在 strerror_r_gnu
函数中,如果不转换 strerror_r
的结果,编译器将发出警告 incompatible integer to pointer conversion returning 'int' from a使用 XSI 版本的
的函数。由于此函数在针对 strerror_r
编译时结果类型为“char *”strerror_r
的 XSI 版本编译时永远不会被调用,所以我不关心类型不匹配,但我希望编译器对此保持沉默。强制转换为 intptr_t
,然后转换为 char *
会消除编译器警告。
问题是,当使用返回 char *
的 GNU strerror_r
编译时,将结果转换为 intptr_t
是否明确定义> 并返回到 char *
?
最佳答案
The question is, when compiling with the GNU strerror_r that returns a char *, is it well-defined to cast the result to
intptr_t
and back to char *?
是的。这种操作的安全性几乎就是标准中 intptr_t
的定义:
7.20.1.4 Integer types capable of holding object pointers
1 The following type designates a signed integer type with the property that any valid pointer to void can be converted to this type, then converted back to pointer to void, and the result will compare equal to the original pointer:
intptr_t
(将其与 6.2.5p28 结合起来:
A pointer to void shall have the same representation and alignment requirements as a pointer to a character type. Similarly, pointers to qualified or unqualified versions of compatible types shall have the same representation and alignment requirements. All pointers to structure types shall have the same representation and alignment requirements as each other. All pointers to union types shall have the same representation and alignment requirements as each other. Pointers to other types need not have the same representation or alignment requirements.
)
关于将指针转换为 intptr_t 并返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51775990/
我正在尝试使用 _Generic 制作线程安全的 strerror 函数,该函数与使用 strerror_r 的 XSI 或 GNU 变体无关. XSI 变体返回一个 int 并修改传递给它的缓冲区的
问题:有没有办法在 C++ 中将指向成员函数的指针转换为 intptr_t? 已知因素: 我知道成员函数指针很特别 我知道成员函数传递隐藏的“this”参数 (__thiscall)。 我知道 siz
我知道它是一个整数类型,可以在不丢失数据的情况下与指针进行转换,但我为什么要这样做呢?与 void* 用于保存指针和 THE_REAL_TYPE* 用于指针算术相比,整数类型有什么优势? 编辑 标
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Easiest way to convert int to string in C++ 有人知道如何进行转换
假设我想将一个 void* 指针移动 4 个字节。是以下等价物: 答: void* new_address(void* in_ptr) { intptr_t tmp = (intptr_t)i
我需要将任意指针转换为数值,以便通过哈希函数传递它。 理想情况下,只是为了好玩,我还希望数字可以转换回同一个指针。但这不是必须的。 在浏览了 SO 和互联网之后,我不清楚 uintptr_t 或 in
我正在尝试在 swift 项目中使用 libmpv。我把所有东西都联系起来了,我正在努力遵循基本的 example . 问题是,要显示视频,我必须将整数指针 (intptr_t) 传递给 wid co
在 ctypes 中我有 TBButton.ptr(ctypes.UInt64("0x1e677e60") 这相当于 aButton.address()在这行代码中: var rez = SendMe
C++(C++11,如果它有所不同)中是否有一个函数可以将字符串转换为 uintptr_t 或 intptr_t?我总是可以使用 atoll() 并在之后转换它,但最好是获得一个函数,该函数对 32
阿法克 uintptr_t intptr_t 可用于保存指向 void 的任何指针。因此,这些类型可用于存储指向数据的指针。 在 C99 或更高版本中,是否有类似的有符号和无符号整数类型能够保存指向函
考虑到我需要将“通用”指针的值存储在结构中并且对指向的内存本身不感兴趣,我发现将其存储为 intptr_t 在此类机器上是否有意义) 关于c - 什么时候 uintptr_t 优于 intptr_t?
使用 intptr_t 作为通用存储(保存指针和整数值)而不是 void* 是个好主意吗? (如此处所示:http://www.crystalspace3d.org/docs/online/manua
intptr_t 和 uintptr_t 的字符串格式是什么,对 32 位和 64 位架构都有效。 编辑 warning: format ‘%x’ expects type ‘unsigned int
我似乎无法理解当我尝试将 void * 值分配给 intptr_t 变量时收到的 GCC 编译器警告。具体来说,当我使用 -std=c99 -pedantic 进行编译时,我收到以下有关第 7 行变量
我可以拿一个 intptr_t并将其分配或 memcpy 到 uintptr_t并再次返回并保证以相同的值结束? 也就是说,以下任何一项都可以保证工作(无断言): 使用赋值: intptr_t i1
更具体地说,如果我有以下函数指针类型: typedef void (*callback_type) (intptr_t context, void* buffer, size_t count); 我可
我正在为 add_signed MPL 类开发一些测试,将类型转换为其已签名的对应项。定义如下: template struct add_signed { typedef T type; };
我正在阅读一些关于 c++11 的资料,我注意到一些关于 int 类型名称的事情。现在,显然该规范只能通过付费获得,但有一份 2 月份的早期草案可在 http://www.open-std.org/j
我在 MinGW 中编译 C 程序时收到此错误。据我所知,我认为“intptr_t”是 C99 标准中的一种类型。我没有包含文件吗? 最佳答案 您需要包含 stdint.h。 请注意,intptr_t
什么时候应该使用 intptr_t 和 size_t 数据类型? 在 32 位平台上,intptr_t 和 size_t 都设置为 32 位。在 64 位平台上,它们被设置为 64 位。有使用指南吗?
我是一名优秀的程序员,十分优秀!