小编Ric*_*ico的帖子

如果变量为空,则设置Makefile

我想设置一个变量,如果它是空的.我试过这样的方式:

....
TEST := $(something)
...
TEST ?= $(something else)
Run Code Online (Sandbox Code Playgroud)

第一个$(something)可能返回一个空字符串,但是条件赋值?=仅在未设置前一个变量时才起作用,而不是在为空时.

任何优雅的解决方案,如果设置变量为空?


编辑 我找到了这个解决方案:

....
TEST := $(something)
...
TEST += $(something else)
TEST := $(word 1, $(TEST))
Run Code Online (Sandbox Code Playgroud)

但我认为会有一个更优雅.

makefile

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

C中的FILE关键字究竟是什么?

我已经开始学习一些C作为一种爱好并且已经盲目地使用FILE作为文件指针的声明很长一段时间了,我一直在想.这是C的关键字或特殊数据类型来处理文件吗?它是否包含文件内的流和其他数据?为什么它被定义为指针?

一个例子来说明我的意思,使其更清晰:

FILE* fp; //<-- this
fp = fopen("datum.txt", "r");

while(!feof(fp)) {
   // etc.
}
Run Code Online (Sandbox Code Playgroud)

c file stdio

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

'unshare'在C api中无法正常工作

这一系列命令有效:

unshare --fork --pid --mount 
umount /proc
mount -t proc proc /proc
umount /dev/pts
mount -t devpts devpts /dev/pts
Run Code Online (Sandbox Code Playgroud)

但是,相应的C程序没有按预期工作(似乎它没有卸载以前的/ proc,并且它还提供了尝试卸载devpts的EBUSY):

unshare(CLONE_NEWPID | CLONE_NEWNS );
int pid = fork();
if (pid != 0) {
    int status;
    waitpid(-1, &status, 0);
    return status;
}

printf("My pid: %i\n", getpid()); // It prints 1 as expected

umount("/proc"); // Returns 0

system("mount"); // Should print error on mtab, but it prints the previous mounted filesystems

mount("proc", "/proc", "proc",
      MS_MGC_VAL | MS_NOSUID | MS_NOEXEC | MS_NODEV, …
Run Code Online (Sandbox Code Playgroud)

c linux linux-namespaces

20
推荐指数
1
解决办法
1494
查看次数

互斥锁优先级

在多线程(2 线程)程序中,我有以下代码:

while(-1)
{
    m.lock();

    (...)

    m.unlock();
}
Run Code Online (Sandbox Code Playgroud)

m是一个互斥体(在我的例子中是 c++11 std::mutex,但我认为如果我使用不同的库它不会改变)。

假设第一个线程拥有互斥锁并且它(...)部分完成了某些操作。第二个线程试图获取互斥锁,但它正在等待第一个线程释放m

问题是:当线程 1 结束(...)执行并解锁互斥锁时,我们是否可以确定线程 2 获取了互斥锁,或者线程 1 可以在线程 2 之前重新获取互斥锁,使其卡在其中lock()

c++ multithreading c++11

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

按类型访问具有重复类型的 std::tuple 应该会产生编译错误

根据标准(或至少cppreference), std::tuple 的 std::get 应:

5-8) 提取类型为 T 的元组 t 的元素。编译失败,除非元组正好有一个该类型的元素。

所以我解释这句话,使得这段代码不能编译:

std::tuple<int, int> my_record;
std::get<int>(my_record) = 10;
Run Code Online (Sandbox Code Playgroud)

因为存在两种相同的类型,我尝试按类型访问元组。但是,GCC 和 Clang 都正确编译了这段代码,并产生了修改第一个元素的效果

为什么?我是否误解了参考文献中的句子?引用错了吗?GCC 和 Clang 不尊重标准吗?

c++ std c++14

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

标签 统计

c ×2

c++ ×2

c++11 ×1

c++14 ×1

file ×1

linux ×1

linux-namespaces ×1

makefile ×1

multithreading ×1

std ×1

stdio ×1