小编loo*_*oop的帖子

C和C++:自动结构的部分初始化

例如,如果somestruct有三个整数成员,我一直认为在C(或C++)函数中执行此操作是可以的:

somestruct s = {123,};
Run Code Online (Sandbox Code Playgroud)

第一个成员将初始化为123,最后两个成员将初始化为0.我经常对自动数组执行相同的操作,写入int arr[100] = {0,};以便将数组中的所有整数初始化为零.


最近我在GNU C参考手册中读到:

如果不初始化结构变量,则效果取决于它是否具有静态存储(请参阅存储类说明符).如果是,则使用0初始化具有整数类型的成员,并将指针成员初始化为NULL; 否则,结构成员的价值是不确定的.


有人可以告诉我C和C++标准对部分自动结构和自动数组初始化的看法吗?我在Visual Studio中执行上述代码没有问题,但我希望与gcc/g ++兼容,也可能与其他编译器兼容.谢谢

c c++

67
推荐指数
3
解决办法
5万
查看次数

socat假http服务器 - 使用文件作为服务器响应

我一直在尝试使用socat来响应每个连接到它正在用虚假的HTTP回复监听的套接字.我无法让它发挥作用.可能是因为我正在使用socat的cygwin版本?我不知道.

部分问题是我希望第二个参数<some_file_response>不被写入.换句话说,因为它是双向的,它会读取response.txt中的内容,然后写入同一个文件,我不希望这样.即使我这样open:response.txt,rdonly做也不重复.system:好像什么也没做.exec看起来它是有效的,例如我可以做,exec:'cat response.txt'但永远不会被发送到连接到端口1234的客户端.

socat -vv tcp-listen:1234,reuseaddr,fork <some_file_response>
Run Code Online (Sandbox Code Playgroud)

我希望它将文件读取到已连接的客户端,然后关闭连接,并反复执行(这就是我使用fork的原因).

我正在对这个问题表示赏心悦目.请仅提供与Windows命令提示符下的cygwin版本一起使用的解决方案.

socat

15
推荐指数
2
解决办法
4652
查看次数

C - 枚举的前向声明?

在C中转发枚举对我来说不起作用.我搜索了互联网和stackoverflow,但所有关于枚举器前向声明的问题都引用了c ++.你在C中声明枚举器怎么办?将它们放在每个文件的顶部(或包含在内),以便文件中的所有函数都可以访问它们?谢谢

c enums enumeration forward-declaration

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

git在提交之前删除新文件中的尾部空格

我知道删除尾随空格可以使用预提交钩子完成.我有兴趣手动完成它.我在这里阅读了这个问题:
让Git在提交之前自动删除尾随空格 - Stack Overflow
最接近我想要的答案是来自ntc2的"自动版本":

(export VISUAL=: && git -c apply.whitespace=fix add -ue .) && git checkout . && git reset
Run Code Online (Sandbox Code Playgroud)


该命令运行良好,除了它似乎只是对已存在于repo中的文件的更改,而不是新文件.我有一堆新文件,这意味着它们还没有在回购中.我想从这些文件中删除空格,所以我尝试添加-A而不是-u,但这并没有什么区别.

git whitespace removing-whitespace

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

C - 'char**'与'char(*)[6]'的间接等级不同

有人可以向我解释下面的问题是什么,更重要的是为什么?

int main( int argc, char *argv[] )
{
    char array[] = "array";
    char **test;
    test = &array;

    *test[0] = 'Z';

    printf( "%s\n", array );

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑

我上面的例子基于这样一个崩溃的函数:

void apple( char **pp )
{
    *pp = malloc( 123 );
    *pp[0] = 'a'; // technically this is correct but in bad form
    *pp[1] = 'b'; // incorrect but no crash
    *pp[2] = '\0'; // incorrect and crash
}
Run Code Online (Sandbox Code Playgroud)

正如Vaughn Cato向我指出的那样虽然*pp[0] = 'a';没有崩溃,但它的状态还不好.正确的形式是括号

void apple( char **pp ) …
Run Code Online (Sandbox Code Playgroud)

c

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

Git提交样式:一次更改所有文件或一次更改一个文件?

我通过一次提交许多文件来保存我的工作.我想知道为每个文件提交是否会更好,但这看起来好多了.

我对现在的方式没有任何问题,但我打算将我的代码放在GitHub上,我希望它易于理解.

我想知道你们其他人使用git是做什么的.如果你能为我拼出来的话.我是Git的新手,我一直在Windows中使用TortoiseGit和gitk.

git version-control git-commit

11
推荐指数
2
解决办法
2297
查看次数

通过联合键入C和C++中的结构

我用gcc和g ++编译了这个迂腐,我不会在任何一个中得到警告:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct a {
    struct a *next;
    int i;
};

struct b {
    struct b *next;
    int i;
};

struct c {
    int x, x2, x3;
    union {
        struct a a;
        struct b b;
    } u;
};

void foo(struct b *bar) {
    bar->next->i = 9;
    return;
}

int main(int argc, char *argv[]) {
    struct c c;
    memset(&c, 0, sizeof c);
    c.u.a.next = (struct a *)calloc(1, sizeof(struct a));
    foo(&c.u.b);
    printf("%d\n", c.u.a.next->i);
    return 0;
} …
Run Code Online (Sandbox Code Playgroud)

c c++ strict-aliasing language-lawyer type-punning

11
推荐指数
1
解决办法
1335
查看次数

git - rebase废墟合并

我有两个独立的分支机构.我在一个多月的不同时间点上了他们.我把一个分支(让我们称之为apple)合并到另一个分支(让我们称之为orange),通过检查橙色和做git merge --no-ff apple,一切都很顺利.在gitk中,我可以清楚地看到每个分支都有自己的历史记录,它在橙色的合并提交中合并在一起.

后来我意识到橙色的提交是不正确的,构建过程中有一个错误,我必须编辑橙色的早期提交.我使用git rebase -i HEAD~19,选择提交并更改pickedit.所以我编辑提交,一切都很好,我完成了rebase.我回到gitk,两个分支的所有历史都是橙色的线性历史.

所以我搞砸了什么,或者这是应该的方式?我使用git reflog回到合并时,然后我在橙色合并之前做了另一次重置很难回到右边,然后我做了rebase并修复了那个提交,之后我做了合并.现在一切看起来都像我期望的那样,来自分支的提交不会交织在一起.

为了将来参考,有人可以告诉我如何在我已经合并到另一个分支的分支上重新提交提交,而不是以隔行扫描提交(线性历史记录)结束?

如果我的术语不正确,请随意编辑.再次感谢

git git-merge git-rebase

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

不抛出但依赖于库的类

我写了一些不抛出异常但却使用STL的类,而STL可以抛出异常.例如,在我的类中有一些函数使用std :: vector,std :: list,std :: string.复制字符串或创建向量时,STL可能会抛出,对吧?所以我无法将我的课程描述为免费例外,对吧?

在这种情况下你们做什么?你在try/catch中包装每个函数吗?你怎么形容你的课程?谢谢

c++ stl

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

Windows中的原子性,波动性和线程安全性

这是我对原子性的理解,它用于确保一个值可以整体而不是部分地读/写.例如,64位值实际上是两个32位DWORD(假设此处为x86),在线程之间共享时必须是原子的,以便同时读/写两个DWORD.这样一个线程就无法读取未更新的半变量.你如何保证原子性?

此外,我的理解是,波动性根本不能保证线程安全.真的吗?

我已经看到它暗示许多只是原子/易失性的地方是线程安全的.我不知道那是怎么回事.我是否还需要一个内存屏障来确保在实际可以保证在另一个线程中读/写之前,读/写任何原子或其他值?

例如,假设我创建了一个挂起的线程,做一些计算将一些值更改为线程可用的结构然后恢复,例如:

HANDLE hThread = CreateThread(NULL, 0, thread_entry, (void *)&data, CREATE_SUSPENDED, NULL);
data->val64 = SomeCalculation();
ResumeThread(hThread);
Run Code Online (Sandbox Code Playgroud)

我想这将取决于ResumeThread中的任何内存障碍?我应该为val64进行互锁交换吗?如果线程正在运行,那会怎么改变呢?

我确定我在这里问了很多,但基本上我想弄清楚的是我在标题中提出的问题:对Windows中的原子性,波动性和线程安全性的一个很好的解释.谢谢

windows multithreading thread-safety atomicity volatility

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