Tag: 可移植性

如何在多个操作系统下获取c中的文件修改时间?

我正在尝试用c编写一个便携式函数,比较2个文件的最后修改时间。 文件很小并且一个接一个地写入,因此我需要比1秒(毫秒)更精细的粒度。 似乎有太多的时间/日期function……

使用指针算法计算类型大小的替代方法

以下代码是100%可移植的吗? int a=10; size_t size_of_int = (char *)(&a+1)-(char*)(&a); // No problem here? std::cout<<size_of_int;// or printf("%zu",size_of_int); PS :问题仅限于学习目的。 所以请不要给出像Use sizeof()等的答案

C – 可移植地获取类型对齐

我正在为一个非常简单的语言编写一个非常小的解释器,它允许简单的结构定义(由其他结构和简单类型组成,如int,char,float,double等)。 我希望字段尽可能少地使用字段,因此使用max_align_t或类似的东西是不可能的。 现在,我想知道是否有更好的方法来获得除此之外的任何单一类型的对齐: #include #include #define GA(type, name) struct GA_##name { char c; type d; }; \ const unsigned int alignment_for_##name = offsetof(struct GA_##name, d); GA(int, int); GA(short, short); GA(char, char); GA(float, float); GA(double, double); GA(char*, char_ptr); GA(void*, void_ptr); #define GP(type, name) printf(“alignment of “#name” is: %dn”, alignment_for_##name); int main() { GP(int, int); GP(short, short); […]

C / C ++算法在不同平台上从同一种子生成相同的伪随机数序列?

标题说明了一切,我正在寻找一些最好的东西,因为我不想添加更多的库。 性能应该很好,因为我需要一个紧凑的高性能循环。 我想这将以随机程度为代价。

在跨平台应用程序中使用snprintf

我正在编写一个C程序,预计将与所有主要编译器一起编译。 目前我在Linux机器上开发GCC,并在提交代码之前在MSVC上编译。 为了使交叉编译变得容易,我正在使用-ansi和-pedantic标志进行编译。 这很有效,直到我开始使用c89标准中没有的snprintf 。 GCC可以在没有-ansi开关的情况下编译它,但MSVC总是会失败,因为它没有C99支持。 所以我做了类似的事情, #ifdef WIN32 #define snprintf sprintf_s #endif 这很有效,因为snprintf和sprintf_s具有相同的签名。 我想知道这是正确的做法吗?

UINT_MAX + 1等于什么?

对于UINT_MAX + 1u ,C中定义的行为是什么? 假设它为零是多么安全?

IEEE754浮点值的便携式序列化

我最近一直致力于一个需要存储和加载大量数据的系统,包括单精度浮点值。 我决定标准化整数的网络字节顺序,并决定以big-endian格式存储浮点值,即: |– Byte 0 –| |– Byte 1 -| Byte 2 Byte 3 # ####### # ####### ######## ######## Sign Exponent Mantissa 1b 8b, MSB first 23b, MSB first 理想情况下,我想提供像htonl()和ntohl()这样的函数,因为我已经使用它们来擦除整数,我也希望以尽可能多的平台独立性的方式实现它(同时假设float类型对应于IEEE754 32位浮点值)。 有没有办法,可能使用ieee754.h ,这样做? 我有一个似乎有效的答案,我将在下面发布,但它似乎非常缓慢和低效,我将不胜感激任何有关如何使其更快和/或更可靠的建议。

使用stddef.h的offsetof而不是滚动你自己的可移植性

这是一个挑剔的细节问题,有三个部分。 上下文是我希望说服一些人无条件地使用的offsetof定义而不是(在某些情况下)滚动自己的定义是安全的。 有问题的程序完全用普通的旧C编写,所以在回答时请完全忽略C ++ 。 第1部分:当以与标准offsetof相同的方式使用时,此宏的扩展是否会引发每个C89的未定义行为,为什么或为什么不这样,并且它在C99中是不同的? #define offset_of(tp, member) (((char*) &((tp*)0)->member) – (char*)0) 注意:人们感兴趣的所有实现都取代了标准的规则,指针只有在指向同一个数组时才能相互减去,通过定义所有指针,无论类型或值,指向单个指针全球地址空间。 因此,在争论这个宏的扩张引发未定义的行为时,请不要依赖于该规则。 第2部分:据您所知,有没有一个已发布的生产C实现,当进行上述宏的扩展时,(在某些情况下)将表现出与使用其offsetof宏时的行为不同的行为代替? 第3部分:据您所知,最近发布的生产C实现是什么,它没有提供stddef.h或者没有在该头文件中提供offsetof的工作定义? 该实现是否声称符合任何版本的C标准? 对于第2部分和第3部分,请仅在您可以命名特定实现并给出其发布日期时回答。 说明可能符合条件的实现的一般特征的答案对我没用。

将缓冲区解释为结构的正确,可移植的方法

我的问题的背景是网络编程。 假设我想通过网络在两个程序之间发送消息。 为简单起见,假设消息看起来像这样,字节顺序不是问题。 我想找到一种正确,可移植且有效的方法来将这些消息定义为C结构。 我知道有四种方法:显式铸造,铸造联合,复制和编组。 struct message { uint16_t logical_id; uint16_t command; }; 明确的铸造: void send_message(struct message *msg) { uint8_t *bytes = (uint8_t *) msg; /* call to write/send/sendto here */ } void receive_message(uint8_t *bytes, size_t len) { assert(len >= sizeof(struct message); struct message *msg = (struct message*) bytes; /* And now use the message […]

如何以可移植的方式检查C ++中是否存在文件?

目前,我使用此代码检查Windows和POSIX兼容的操作系统(Linux,Android,MacOS,iOS,BlackBerry 10)上是否存在文件: bool FileExist( const std::string& Name ) { #ifdef OS_WINDOWS struct _stat buf; int Result = _stat( Name.c_str(), &buf ); #else struct stat buf; int Result = stat( Name.c_str(), &buf ); #endif return Result == 0; } 问题: 这段代码有什么缺陷吗? (也许是一个无法编译的操作系统) 是否可以仅使用C / C ++标准库以真正可移植的方式进行? 如何改进? 寻找规范的例子。