Tag: 便携性

__get_cpuid的可移植性如何?

我正在使用__get_cpuid()获取我的程序运行的x86和x86_64处理器的信息。 在Linux和Mac OS上使用GCC,似乎编译并运行OK而不包含任何标题,但这有多便携? 它可以与其他编译器一起使用吗? 我应该包含一个标题吗?

C签署的部门

我正在读安德鲁·科宁的“ C Traps and Pitfalls ”一书中有关C便携性的部分。 在整数divison上 q = a/b; r = a%b; 如果a是负数,显然提醒r可以是负数或正数,同时满足属性 q * b + r == a 通常情况下,如果股息a为负数,我认为r为负数。 这就是我在使用gcc的intel机器中看到的。 我只是好奇你有没有看到一台机器在股息为负数时会返回正面提示?

如何打印像ino_t这样的未知大小的类型?

我经常遇到这样的情况:我想用printf打印整数类型的实现定义大小的值(比如ino_t或time_t )。 现在,我使用这样的模式: #include ino_t ino; /* variable of unknown size */ printf(“%” PRIuMAX, (uintmax_t)ino); 这种方法到目前为止有效,但它有一些缺点: 我必须知道我正在尝试打印的类型是签名还是未签名。 我必须使用可能会扩大我的代码的类型转换。 有更好的策略吗?

C的哪些部分最便携?

我最近阅读了Lua共同创作者Luiz H. de Figueredo和Roberto Ierusalimschy的采访,他们在那里讨论了Lua的设计和实现。 至少可以说是非常有趣的。 然而,讨论的一部分在我的脑海中带来了一些东西。 Roberto称Lua是一个“ 独立应用程序 ”(也就是说,它是纯粹的ANSI C,它不使用操作系统。)他说,Lua的核心是完全可移植的,并且因为它的纯度已经能够移植很多更容易和甚至从未考虑过的平台(例如机器人和嵌入式设备)。 现在这让我很奇怪。 C一般来说是一种非常便携的语言。 那么,C的哪些部分(即标准库中的部分)是最不可移植的? 什么是可以预期在大多数平台上工作的? 是否应该只使用一组有限的数据类型(例如避免short和可能float )? FILE和stdio系统怎么样? malloc和free ? 似乎Lua避免了所有这些。 这会把事情发挥到极致吗? 或者它们是可移植性问题的根源? 除此之外,还有什么其他方法可以使代码非常便携? 我问这一切的原因是因为我目前正在用纯C89编写一个应用程序,并且它最好是尽可能便携。 我愿意采取一条中间路来实现它(足够便携,但没有那么多,我必须从头开始编写所有内容。)无论如何,我只是想看看编写最佳C代码的关键。 最后,所有这些讨论仅与C89有关。

在C中如何编写适合OS的行尾字符?

Unix有\ n,Mac是\ r \ n但现在是\ n而DOS / Win32是\ r \ n。 使用C创建文本文件时,如何确保使用适合操作系统的任何行结束字符?

如何在通用标头中键入实现定义的结构?

我有一个C项目,旨在可移植到各种(PC和嵌入式)平台。 应用程序代码将使用具有特定于平台的实现的各种调用,但共享一个通用(通用)API以帮助实现可移植性。 我试图找到最合适的方式来声明函数原型和结构。 这是我到目前为止所提出的: main.c中: #include “generic.h” int main (int argc, char *argv[]) { int ret; gen_t *data; ret = foo(data); … } generic.h 🙁平台无关包括) typedef struct impl_t gen_t; int foo (gen_t *data); impl.h 🙁特定于平台的声明) #include “generic.h” typedef struct impl_t { /* … */ } gen_t; impl.c 🙁特定于平台的实现) int foo (gen_t *data) { … } […]

64位上的int vs size_t

将代码从32位移植到64位。 有很多地方 int len = strlen(pstr); 这些都会产生警告,因为strlen()返回的是size_t,它是64位,而int仍然是32位。 所以我一直在用它们取而代之 size_t len = strlen(pstr); 但我刚刚意识到这不安全,因为size_t是无符号的,可以将其视为代码签名(我实际遇到了一个导致问题的情况,谢谢,unit testing!)。 盲目地将strlen返回到(int)感觉很脏。 或者也许它不应该? 所以问题是:这有一个优雅的解决方案吗? 我可能在代码库中有一千行代码; 我不能手动检查它们中的每一个,测试覆盖率目前介于0.01和0.001%之间。

如何将整数转换为可移植的字符串?

我正在寻找一种以可移植的方式将整数转换为字符串的方法(至少在Windows和Linux以及x86和x86_64之间可移植),而我虽然itoa(X)是标准的,就像atoi(1) 。 但我在维基百科条目中阅读了以下内容: itoa函数是标准C编程语言的普遍非标准扩展。 它不能被轻易使用,因为它没有在任何C语言标准中定义; 但是,编译器通常在处于非符合模式时通过头提供它,因为它是标准库函数atoi的逻辑对应物。 所以我想知道是否有任何方法可以以便携方式进行。 如果我必须编写自己的函数,我需要注意哪些事情?

在标准C中声明固定大小的整数typedef

是否有一种可靠的方法来为ISO标准C中的固定8,16,32和64位长度的整数类型声明typedef? 当我说ISO标准C时,我的意思是: ISO C89 / C90,而不是C99。 没有在ISO标准中定义的标头。 没有ISO标准中未定义的预处理器符号。 ISO标准中未指定类型大小的假设。 没有专有供应商符号。 我在StackOverflow中看到了与此类似的其他问题,但没有答案尚未违反上述约束之一。 我不确定没有诉诸平台符号是可能的。

编写可移植的C程序 – 需要考虑哪些事项?

对于大学的项目,我需要扩展现有的C应用程序,该应用程序最终将运行在各种商业和非商业unix系统(FreeBSD,Solaris,AIX等)上。 当我想编写一个最便携的C程序时,我需要考虑哪些事项?