我想设置一个变量,如果它是空的.我试过这样的方式:
....
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)
但我认为会有一个更优雅.
我已经开始学习一些C作为一种爱好并且已经盲目地使用FILE作为文件指针的声明很长一段时间了,我一直在想.这是C的关键字或特殊数据类型来处理文件吗?它是否包含文件内的流和其他数据?为什么它被定义为指针?
一个例子来说明我的意思,使其更清晰:
FILE* fp; //<-- this
fp = fopen("datum.txt", "r");
while(!feof(fp)) {
// etc.
}
Run Code Online (Sandbox Code Playgroud) 这一系列命令有效:
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) 在多线程(2 线程)程序中,我有以下代码:
while(-1)
{
m.lock();
(...)
m.unlock();
}
Run Code Online (Sandbox Code Playgroud)
m是一个互斥体(在我的例子中是 c++11 std::mutex,但我认为如果我使用不同的库它不会改变)。
假设第一个线程拥有互斥锁并且它(...)部分完成了某些操作。第二个线程试图获取互斥锁,但它正在等待第一个线程释放m。
问题是:当线程 1 结束(...)执行并解锁互斥锁时,我们是否可以确定线程 2 获取了互斥锁,或者线程 1 可以在线程 2 之前重新获取互斥锁,使其卡在其中lock()?
根据标准(或至少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 不尊重标准吗?