标签: portability

套接字选项SO_REUSEADDR和SO_REUSEPORT,它们有何不同?它们在所有主要操作系统中的含义是否相同?

man pages和程序员单证套接字选项SO_REUSEADDR,并SO_REUSEPORT针对不同的操作系统,不同的,往往非常混乱.有些操作系统甚至没有选项SO_REUSEPORT.WEB中充满了关于此主题的矛盾信息,并且通常您可以找到仅对特定操作系统的一个套接字实现的信息,这些信息甚至可能在文本中没有明确提及.

那究竟有什么SO_REUSEADDR不同SO_REUSEPORT呢?

系统是否没有SO_REUSEPORT更多限制?

如果我在不同的操作系统上使用任何一个,那么预期的行为究竟是什么?

unix sockets linux windows portability

630
推荐指数
2
解决办法
24万
查看次数

是否有可移植的方式来获取Python中的当前用户名?

是否有一种可移植的方式来获取Python中当前用户的用户名(即,至少在Linux和Windows下都能运行的用户名).它的工作方式如下os.getuid:

>>> os.getuid()
42
>>> os.getusername()
'slartibartfast'
Run Code Online (Sandbox Code Playgroud)

我搜索了一下,并且惊讶地发现没有找到确定的答案(尽管我可能只是谷歌搜索不好).该PWD模块提供了一个相对简单的方法来实现这一目标下,说,Linux的,但它不存在于Windows.一些搜索结果表明,在Windows下获取用户名在某些情况下可能会很复杂(例如,作为Windows服务运行),尽管我还没有验证.

python portability username

575
推荐指数
13
解决办法
34万
查看次数

为什么要快速运行glibc的问题太复杂了?

我在这里浏览strlen代码,想知道是否真的需要代码中使用的优化?例如,为什么下面这样的东西不能同样好或更好?

unsigned long strlen(char s[]) {
    unsigned long i;
    for (i = 0; s[i] != '\0'; i++)
        continue;
    return i;
}
Run Code Online (Sandbox Code Playgroud)

较简单的代码对编译器进行优化是否更好或更容易?

strlen链接后面页面上的代码如下所示:

/* Copyright (C) 1991, 1993, 1997, 2000, 2003 Free Software Foundation, Inc.
   This file is part of the GNU C Library.
   Written by Torbjorn Granlund (tege@sics.se),
   with help from Dan Sahlin (dan@sics.se);
   commentary by Jim Blandy (jimb@ai.mit.edu).

   The GNU C Library is free software; you can redistribute it and/or
   modify it under …
Run Code Online (Sandbox Code Playgroud)

c optimization portability glibc strlen

283
推荐指数
7
解决办法
5万
查看次数

我为什么不#include <bits/stdc ++.h>?

我在我的代码中发布了一个问题,其唯一的#include指令如下:

#include <bits/stdc++.h>
Run Code Online (Sandbox Code Playgroud)

我的老师告诉我这样做,但在评论部分,我被告知我不应该这样做.

为什么?

c++ portability c++-faq turbo-c++ implementation-defined-behavior

215
推荐指数
6
解决办法
2万
查看次数

是否有替代unistd.h for Windows(Visual C)?

我正在将一个为Unix编写的相对简单的控制台程序移植到Windows平台(Visual C++ 8.0).所有源文件都包含"unistd.h",它不存在.删除它,我得到关于'srandom','random'和'getopt'错误原型的投诉.我知道我可以替换随机函数,我很确定我可以找到/ hack-up一个getopt实现.

但我相信其他人也遇到了同样的挑战.我的问题是:Windows中有"unistd.h"端口吗?至少有一个包含那些具有本机Windows实现的功能 - 我不需要管道或分叉.

编辑:

我知道我可以创建我自己的"unistd.h",其中包含我需要的东西的替换 - 特别是在这种情况下,因为它是一个有限的集合.但是,由于它似乎是一个常见的问题,我想知道是否有人已经为更大的功能部分完成了工作.

无法在工作中切换到不同的编译器或环境 - 我坚持使用Visual Studio.

c c++ windows portability unistd.h

158
推荐指数
5
解决办法
27万
查看次数

我该如何打印off_t和size_t等类型?

我正在尝试打印类似off_tsize_t.什么是正确的占位符printf() 是可移植的

或者是否有完全不同的方式来打印这些变量?

c portability format-specifiers

141
推荐指数
3
解决办法
13万
查看次数

什么属于教育工具,以展示人们在C/C++中做出的无根据的假设?

我想为SO准备一些教育工具,这应该有助于初学者(和中级)程序员识别和挑战他们在C,C++及其平台中的无根据的假设.

例子:

  • "整数环绕"
  • "每个人都有ASCII"
  • "我可以将函数指针存储在void*中"

我认为可以在各种平台上运行一个小型测试程序,它运行"合理的"假设,根据我们在SO中的经验,通常是由许多缺乏经验/半经验的主流开发人员制作的,并记录他们在各种机器上打破的方式.

这样做的目的不是要证明做某事是"安全的"(这是不可能做到的,测试只有在他们破坏的情况下证明了什么),而是向最难以理解的个体展示最不起眼的表达方式如果它具有未定义或实现定义的行为,则在另一台机器上中断..

为此,我想问你:

  • 如何改进这个想法?
  • 哪些测试会很好,它们应该是什么样的?
  • 您是否可以在可以获得的平台上运行测试并发布结果,以便最终得到平台数据库,它们之间的区别以及为什么允许这种差异?

这是测试玩具的当前版本:

#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
#include <stddef.h>
int count=0;
int total=0;
void expect(const char *info, const char *expr)
{
    printf("..%s\n   but '%s' is false.\n",info,expr);
    fflush(stdout);
    count++;
}
#define EXPECT(INFO,EXPR) if (total++,!(EXPR)) expect(INFO,#EXPR)

/* stack check..How can I do this better? */
ptrdiff_t check_grow(int k, int *p)
{
    if (p==0) p=&k;
    if (k==0) return &k-p;
    else return check_grow(k-1,p);
}
#define BITS_PER_INT (sizeof(int)*CHAR_BIT)

int bits_per_int=BITS_PER_INT;
int int_max=INT_MAX; …
Run Code Online (Sandbox Code Playgroud)

c c++ portability cross-platform

120
推荐指数
8
解决办法
8933
查看次数

如何使用ANSI C测量时间(以毫秒为单位)?

仅使用ANSI C,有没有办法以毫秒或更多精度测量时间?我正在浏览time.h但我只发现了第二个精确功能.

c portability time-precision

118
推荐指数
6
解决办法
21万
查看次数

我如何可移植地调用C++函数,该函数在某些平台上采用char**而在其他平台上采用const char**?

在我的Linux(和OS X)机器上,该iconv()函数具有以下原型:

size_t iconv (iconv_t, char **inbuf...
Run Code Online (Sandbox Code Playgroud)

而在FreeBSD上它看起来像这样:

size_t iconv (iconv_t, const char **inbuf...
Run Code Online (Sandbox Code Playgroud)

我希望我的C++代码能够在两个平台上构建.C编译器,传递char**用于一个const char**参数(或反之亦然)通常发射一个单纯的警告; 但是在C++中,这是一个致命的错误.因此,如果我传递一个char**,它将无法在BSD上编译,如果我传递const char**它将无法在Linux/OS X上编译.如何编写可编译在两者上的代码,而无需尝试检测平台?

我有一个(失败的)想法是提供一个覆盖标题提供的任何本地原型:

void myfunc(void) {
    size_t iconv (iconv_t, char **inbuf);
    iconv(foo, ptr);
}
Run Code Online (Sandbox Code Playgroud)

这个失败是因为iconv需要C链接,你不能放在extern "C"一个函数内(为什么不呢?)

我想出的最好的工作思路是抛出函数指针本身:

typedef void (*func_t)(iconv_t, const char **);
((func_t)(iconv))(foo, ptr);
Run Code Online (Sandbox Code Playgroud)

但这有可能掩盖其他更严重的错误.

c++ portability const

91
推荐指数
4
解决办法
5369
查看次数

现代C++的实验性功能是否可靠用于长期项目?

我有一个目前使用C++ 11/14的项目,但它需要类似的东西std::filesystem,它只在C++ 17中可用,因此我没有机会当前使用它.但是,我看到它在我当前的编译器中可用std::experimental::filesystem.使用实验性功能是一个好主意,假设我将来可以添加如下内容:

#ifdef CXX17 //if this is C++17
std::filesystem::something ...;
#else
std::experimental::filesystem::something ...;
#endif
Run Code Online (Sandbox Code Playgroud)

我担心的是:

1.是否保证所有兼容编译器具有相同的实验功能?

2.实验性特征是否容易发生重大变化,使其不可靠?

也许还有更多值得关注的事情.我为什么要或不应该使用它们?我对一个新项目感到困惑,不知道该决定什么.

c++ portability c++-standard-library c++11 c++17

84
推荐指数
4
解决办法
9305
查看次数