小编i33*_*36_的帖子

GCC 10.2.1 上的“多重定义”“首先在此处定义”,但 GCC 8.3.0 上没有

我稍微浏览了一下 Stackoverflow 和更广泛的互联网,发现导致此错误的最常见原因是声明( int var = 1;) 和定义( int var;) 的合并,以及包含文件.c中的文件.h

我刚刚从一个文件分成几个文件的小项目没有做任何这些事情。我困惑。

我制作了该项目的副本,并删除了副本中的所有代码(这很有趣),直到到达这里:

主程序

#include "a.h"

int main() {
    
}
Run Code Online (Sandbox Code Playgroud)

#ifndef A_H
#define A_H

int test;

#endif
Run Code Online (Sandbox Code Playgroud)

交流电

#include "a.h"
Run Code Online (Sandbox Code Playgroud)

几乎是规范的,对吧?但是...

$ rm *.o; gcc -g -c a.c; gcc -g -c main.c; gcc -o main main.o a.o
/usr/bin/ld: a.o:/.../a.h:5: multiple definition of `test'; main.o:/.../a.h:5: first defined here
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

瓦特:(

大约在这个时候,我开始质疑我的配置,并尝试了另一台机器,通过 NFS …

c linux standards gcc header-files

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

在图像上设置不透明度会导致重叠元素的盒阴影消失

下面的CSS,施加到一个<a>与一个<div>驻留在个人<tr><td>在一个元件<table>(与border-collapsetd { padding: 0px; }设定)时,按预期方式工作:

a {
    background-image: url("http://ibin.co/19rwR69EOigr");
    height: 100px;
    width: 120px;
    display: block;
}
div {
    width: 200px;
    box-shadow: #000 0px 0px 13px;
}
Run Code Online (Sandbox Code Playgroud)

如果我对它应用任何不透明度<a>,浏览器的内部分层似乎可怕地破坏.

对照 请注意,即使在第一个示例中,测试图片的最后一个像素也位于<div>s 内box-shadow.(它说opacity = ".99",如果你在图像中看不到它.>.)

这可能是一个渲染错误,已成功蔓延到Firefox Chrome?:P

看看这个JSFiddle打开和关闭的内容.

提前致谢!

css opacity css3

12
推荐指数
1
解决办法
958
查看次数

为什么`cat <(cat)`会产生EIO?

我有一个程序可以同时读取两个输入文件.我想从标准输入中读取该程序.我以为我会用这样的东西:

$program1 <(cat) <($program2)
Run Code Online (Sandbox Code Playgroud)

但我刚刚发现了

cat <(cat)
Run Code Online (Sandbox Code Playgroud)

产生

....
mmap2(NULL, 139264, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb758e000
read(0, 0xb758f000, 131072)             = -1 EIO (Input/output error)
....
cat: -: Input/output error
Run Code Online (Sandbox Code Playgroud)

同样地,

$ cat <(read -n 1)
bash: read: read error: 0: Input/output error
Run Code Online (Sandbox Code Playgroud)

所以...... Linux无法进入read系统调用级别.那很有意思.是bash不是将stdin连接到子壳?:(

这个问题有方法解决吗?我特别需要使用进程替换(... <(...)格式),因为$program1(tail顺便说一下)需要文件,我需要od在标准输入上做一些预处理(with )才能传递给它tail- 我不能只指定/dev/stdin等等.

编辑:

我真正想要做的是从一个文件(另一个进程将写入)读取,同时我从标准输入读取,所以我可以接受命令等.我希望我能做到

tail -f <(od -An -vtd1 -w1) <(cat fifo)
Run Code Online (Sandbox Code Playgroud)

同时从标准输入 FIFO中读取并将其放入单个stdout流中,我可以通过awk(或类似的)运行.我知道我可以用任何脚本语言解决这个问题,但我喜欢学习如何 …

io bash stdin subshell process-substitution

10
推荐指数
1
解决办法
399
查看次数

*scanf 中 %n 运算符的一致性和行为

我目前正在将一些 HTTP 处理构建到 C 程序(在 Linux 上使用 glibc 编译)中,该程序将位于 nginx 实例后面,并认为sscanf在这种情况下我应该安全地将参数标记化推迟到。

我很高兴地发现从 URI 中提取查询非常简单:

char *path = "/events?a=1&b=2&c=3";

char query[64] = {0};

sscanf(path, "%*[^?]?%64s HTTP", query); // query = "a=1&b=2&c=3"
Run Code Online (Sandbox Code Playgroud)

但我很惊讶的速度有多快的事情成为我??????ň???? T'ê????? R'E'ST ??? ???我???ň?g ^   :(

int pos = -1;
char arg[32] = {0}, value[32] = {0};

int c = sscanf(query, "%32[^=]=%32[^&]&%n", &arg, &value, &pos);
Run Code Online (Sandbox Code Playgroud)

对于 的输入a=1&b=2,我得到arg="a", value="1", c=2, pos=4。完美:我现在可以重新运行 sscanfpath + pos以获得下一个参数。为什么我在这里?

好了,而a=1&的行为相同以上,a=1 …

c glibc scanf undefined-behavior

7
推荐指数
1
解决办法
55
查看次数

WebSQL对浏览器的支持不断增加。它的未来是什么?

我已经四处查看,发现WebSQL的未来似乎有些艰难。

一方面,由于实际上每个实际实现都只使用SQLite3,因此它显然被广泛视为一种解决方案,因为该规范本身大量借鉴了SQLite3的设计语义,如果专门使用SQLite3 将非常棘手。。

另一方面,自2017年2月起,所有主流浏览器似乎都支持它(http://caniuse.com/#search=websql)-Chrome已经有很长的历史了,它是在IE11 Edge 14中引入的,Firefox 50和Safari10。移动支持似乎也在积极发展(现在,只有注释说明它在某些三星手机上由于某些原因无法使用)。

IndexedDB背后的理论确实是有道理的:这是一个崭新的标准,不与任何现有库绑定,供应商可以设计自己的实现,进行竞争并避免供应商/库锁定。但是,我陷入了IndexedDB最不利的方面之一:由于实现开销,其抽象设计的性能似乎绝对是灾难性的。

http://scaljeri.github.io/indexeddb-vs-websql/v2.0.0/index.html是一键式IndexedDB-vs-WebSQL决战。我将其设置为10000个项目(一个相当适中的数字),并尝试使用我的ThinkPad T43-具有2GB RAM的单核2GHz PentiumM。

首先,除了运行Chromium之外,什么都没有执行,大多数选项卡都已挂起,其余选项卡未使用任何CPU:

在此处输入图片说明

在IndexedDB的整个“插入”时间内,该选项卡使用100%CPU,并且系统通常无法使用。(我可以浏览一下-屏幕重绘的速度确实很慢-但我并不是为了获得准确的基准)。

当我有很多其他事情发生时,我也碰巧在使用该选项卡,并且系统恰好要交换死机(在这台特定的机器上发生了很多事情):

在此处输入图片说明

然而,在整个过程中,WebSQL的性能令人难以置信。即使在系统进行大量交换(到较慢的HDD)时,插入一排行也需要三秒钟,并且系统I / O受到很大影响。(注意:默认情况下,我知道SQLite3会将所有数据强制刷新到磁盘上以确保完整性,但是我不确定Chrome的实现是否为WebSQL禁用了此选项。)

https://nolanlawson.com/2015/09/29/indexeddb-websql-localstorage-what-blocks-the-dom/(自2015年9月起)完成的基准测试似乎与我在此处介绍的内容基本一致;它表明,在2013年的Macbook Air上,IndexedDB的性能明显比WebSQL差。

考虑到这些考虑因素,我有两个问题。

  1. WebSQL 作为Web标准的实际未来是什么?SQLite3可以在任何地方(它是ANSI C)运行,并且WebSQL似乎得到了广泛支持(?)。

    我的问题本来是要专门询问有关Chrome扩展程序的支持(请参阅下一点),但是现在我考虑了一下,如果我想要替代localStorage(及其5MB的限制),我想使用WebSQL作为主要解决方案,而很少(如果曾经)使用过IndexedDB或localStorage作为后备。通过这种方法,我成功的机会是什么?

  2. 浏览器供应商是否有可能很快放弃对网站和/或扩展的WebSQL支持?

    我正处于Chrome扩展程序的设计初期,该程序需要存储可能大量的信息-它将管理历史记录/书签/等,这些数据将永远增长而永不缩减。我要在所有计算机上使用此扩展,包括上面显示的基准测试中的T43。

    在我看来,这是WebSQL还是什么都没有;我不同意IndexedDB。如果WebSQL看起来将要消失,我将在Go或类似的服务器上制造一个小型应用服务器,然后简单地与之交谈。

    同样,如果有一天WebSQL从Chrome随机“离开”,即使Web支持消失了,对它的扩展支持也将继续吗?

web-standards google-chrome-extension web-sql deprecation-warning

6
推荐指数
0
解决办法
1574
查看次数

Base128 编码对于 JavaScript 字符串等场景有多可行?

我最近发现base32、base64和base128是最有效的base- n编码形式,虽然base58、Ascii85、base91、base92等由于使用了更多字符而确实比普遍存在的base64提供了一些效率改进,但是一些映射损失;例如,base92 中的每个字符对恰好有 272 个索引,这些索引无法映射到以 10 为底的 2 的幂,因此完全被浪费了。(Base91 编码仅丢失 89 个字符(如上面链接中的脚本所示),但它已获得专利。)

如果能够在现代的现实场景中使用 base128,那就太好了。

0x21 (33) 到 0x7E (126) 之间有 92 个可用字符(不含 \"),这为创建具有尽可能多字符的可 JSON 字符串提供了良好的开端。

以下是我设想的找到其余角色的几种方法。这就是我要问的问题。

  • 就傻傻的用Unicode吧

    可以使用两字节 Unicode 字符来填充剩余的 36 个所需索引。高度次优;如果这比网络上的 Base64 更糟糕,我不会感到惊讶。仅对 Unicode 字符计数场景有用,例如推文长度。不完全是我想要的。
     

  • 从上限 (>128) ASCII 范围内选择 36 个非 Unicode 字符

    JavaScript 是在字符编码配置偶尔会出现严重错误的情况下构建的。因此,该语言(和网络浏览器)可以很好地处理打印任意和不可打印的二进制数据。那么为什么不直接使用 ASCII 范围的上限呢?是要用的,对吧?

    一个非常现实的问题可能是数据在我的浏览器和服务器之间通过 HTTP 传输并通过一个或多个开罐器代理。事情会变得多么糟糕?我知道几年前,甚至在今天,基于 HTTP 的 WebSocket 造成了一些真正的痛苦。
     

  • 有趣的方式使用 UTF-8

    UTF-8 定义 1 到 4 字节长的序列来封装 Unicode 代码点。字节 2 到 4 …

javascript encoding bit-manipulation utf-8 character-encoding

6
推荐指数
1
解决办法
4569
查看次数

使用PHP套接字模块检测对等断开连接(EOF)

我对PHP的套接字库有一个奇怪的问题:我似乎无法检测/区分服务器EOF,因此我的代码无助地进入无限循环.

进一步说明如下; 首先,一些背景(这里没有什么特别的花哨):

<?php

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, '127.0.0.1', 8081);

for (;;) {

    $read = [$socket];
    $except = NULL;
    $write = [];

    print "Select <";
    $n = socket_select($read, $write, $except, NULL);
    print ">\n";

    if (count($read)) {

        print "New data: ";

        #socket_recv($socket, $data, 1024, NULL);
        $data = socket_read($socket, 1024);

        print $data."\n";

    }

    print "Socket status: ".socket_strerror(socket_last_error())."\n";

}
Run Code Online (Sandbox Code Playgroud)

上面的代码只是连接到服务器并打印它读取的内容.它是我正在编写的小型套接字库中的缩减版本.

为了测试,我目前正在使用ncat -vvklp 8081绑定套接字并成为服务器.随着运行,我可以启动上面的代码,它连接和工作 - 例如,我可以键入ncat窗口,PHP接收它.(从PHP发送数据也有效,但我已将该代码排除在外,因为它不相关.)

然而,就在我的时刻^C ncat,上面的代码进入了一个硬无限循环 - 而且PHP说套接字上没有错误.

我试图弄清楚按钮在哪里打击PHP头部并使其意识到对等已断开连接.

  • socket_get_status()是一个很大的用词 - 它是别名stream_get_meta_data() …

php sockets eof

5
推荐指数
1
解决办法
1095
查看次数

在32位系统上寻找非常大的文件

我目前正在seek与一个在32位(x86)盒子上运行的C程序进行小规模的斗争.

具体来说,我似乎无法超越看似相当随意的文件偏移.

如果我做:

unsigned long long pos = 15032385535LLU;
int r = fseek(fd, pos, SEEK_SET);
Run Code Online (Sandbox Code Playgroud)

然后我会的

fstat64(3, {st_mode=S_IFREG|0644, st_size=1000000000000, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77c3000
_llseek(3, 2147479552, [2147479552], SEEK_SET) = 0
read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4095) = 4095
Run Code Online (Sandbox Code Playgroud)

TL; DR可行.

但是,如果我增加pos的只是1 ...

unsigned long long pos = 15032385536LLU;
int r = fseek(fd, pos, SEEK_SET);
Run Code Online (Sandbox Code Playgroud)

......然后一切都惊人地崩溃了:

fstat64(3, {st_mode=S_IFREG|0644, st_size=1000000000000, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb771e000
_llseek(3, 18446744071562067968, …
Run Code Online (Sandbox Code Playgroud)

c seek large-files 32bit-64bit

4
推荐指数
1
解决办法
397
查看次数