看看这个片段:
struct [[nodiscard]] Result {
};
struct DiscardableResult: Result {
};
Run Code Online (Sandbox Code Playgroud)
是否DiscardableResult
有[[nodiscard]]
属性?如果是,是否有可能以某种方式将其删除?
作为我的一个类的赋值的一部分,我必须在C中编写一个程序来复制ls -al命令的结果.我已经阅读了必要的材料,但我仍然没有得到正确的输出.这是我的代码到目前为止,它只应打印出文件大小和文件名,但其打印的文件大小不正确.
码:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
int main(int argc, char* argv[])
{
DIR *mydir;
struct dirent *myfile;
struct stat mystat;
mydir = opendir(argv[1]);
while((myfile = readdir(mydir)) != NULL)
{
stat(myfile->d_name, &mystat);
printf("%d",mystat.st_size);
printf(" %s\n", myfile->d_name);
}
closedir(mydir);
}
Run Code Online (Sandbox Code Playgroud)
这些是执行代码后的结果:
[root@localhost ~]# ./a.out Downloads
4096 ..
4096 hw22.c
4096 ankur.txt
4096 .
4096 destination.txt
Run Code Online (Sandbox Code Playgroud)
这是正确的尺寸:
[root@localhost ~]# ls -al Downloads
total 20
drwxr-xr-x. 2 root root 4096 Nov 26 01:35 .
dr-xr-x---. …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个使用ftdi D2XX驱动程序与ENTTEC DMX usb pro设备连接的项目.存储在/ usr/local/lib /中的ftdi驱动程序(libftdi2xx.so.1.1.12)是针对glibc v2.14或更高版本编译的.
我正在开发debian 7,它只支持glibc v2.13.执行我编写的C代码(调用ftdi驱动程序)时,它会出错:
./a.out: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /usr/local/lib/libftd2xx.so)
Run Code Online (Sandbox Code Playgroud)
这是有道理的,因为知道glibc版本是不兼容的.我已经下载并安装了最新版本的glibc(v2.17)到我的计算机上的临时目录('〜/ glibc-testing/install/lib /')并使用该调用:
~/glibc-testing/install/lib/ld-linux-x86-64.so.2 --library-path ~/glibc-testing/install/lib/ ./a.out
Run Code Online (Sandbox Code Playgroud)
通过此调用,我能够成功运行C代码.
我想将此C代码编译为共享库.它将用于与DMX设备连接,并将由C#开发的主应用程序调用.
我不确定如何前进.我需要做的是告诉fdti驱动程序始终使用较新的glibc,同时让应用程序的其余部分使用普通库.ftdi 2DXX驱动程序仅可预编译(无源代码可用).有没有办法将这个预编译的程序链接到新库?
我已经查看了导出LD_LIBRARY_PATH =/home /.../ glibc/install/lib /的选项,但收效甚微.
谢谢!
我正在使用一个API,它FILE *
正在使用它来创建内存中的数据缓冲区:
std::shared_ptr<FILE> f(tmpfile(), fclose);
write_to_file(f.get());
rewind(f.get());
auto data = make_file_buffer(f.get());
return data;
Run Code Online (Sandbox Code Playgroud)
这有效,但比写入内存缓冲区要慢.
是否有可能将其写入内存文件并避免读/写磁盘(如stdin/stdout/stderr读/写控制台)?
注意:我使用的是Linux,因此可以访问Linux和POSIX API.
编译好是正常的吗?
#include <vector>
#include <algorithm>
int main()
{
std::vector<int> buf;
generate(buf.begin(), buf.end(), []{ return 0; });
}
Run Code Online (Sandbox Code Playgroud)
(注意std::
前面缺少的generate()
)
这种行为是否记录在某处?或者我偶然发现了编译器或库错误?在我的例子中,在Linux上是GCC 5.3.0和Clang 3.8.0; 两者都使用libstdc ++,所以也许库bug?
很简单的问题.这是有效的C++ 11吗?
struct Foo {
int bar = 1;
int baz = bar;
};
Run Code Online (Sandbox Code Playgroud)
GCC(4.7.2)和Clang(3.1)都接受了迂腐的设置:
-std=c++11 -Wall -W -pedantic
英特尔C++(13.0.1.117)没有.它咆哮int baz = bar;
着:
error: a nonstatic member reference must be relative to a specific object
谁是对的?
如果您想知道,我将此用于此类代码,它将初始化代码放在一起,而不是将最后一行移动到构造函数中:
uint8_t colorR = -1;
uint8_t colorG = -1;
uint8_t colorB = -1;
uint8_t colorA = -1;
GLubyte RGBAVec[4] = {colorR, colorG, colorB, colorA};
Run Code Online (Sandbox Code Playgroud) 我正在我的计算机上构建我的程序libtiff.so -> libtiff.so.5
.然后将构建推送到另一台机器上libtiff.so -> libtiff.so.4
.
在运行时,我的程序存在:«加载共享库时出错libtiff.so.5
::无法打开共享对象文件:没有这样的文件或目录».
我无法升级其他机器,我想避免在虚拟机上编译(使用与执行机器相同的linux版本).因此,我想强制编译器使用libtiff.so.4
而不是libtiff.so.5
.
我已经libtiff.so.4
安装在我的电脑上(以及libtiff.so.5
).如何强制与此版本的链接而不是新版本.我想要移动它libtiff.so -> libtiff.so.4
,但是如果它需要最新版本我会害怕破坏我的系统(apt-get purge libtiff5
因为其他一些软件包需要它而给出错误).
是否可以链接到较旧(已安装)的库版本?如果有,怎么样?改变libtiff.so
旧版本的符号链接是否有害?如果没有,它会解决我的问题吗?
我有一个operator[]
为我的班级,它所做的只是呼吁std::unique_ptr::operator[]
一个unique_ptr
成员.相关部分就是这样:
template <typename T> struct Foo {
T& operator [](const size_t pos) const noexcept
{
return data_[pos];
}
std::unique_ptr<T[]> data_;
};
Run Code Online (Sandbox Code Playgroud)
我已将运营商标记为noexcept
.然而,unique_ptr::operator[]
是不是 noexcept
.我无法找出原因,以及我是否可以假设它永远不会抛出.unique_ptr::operator[]
本身没有列出文档中的任何异常(cppreference和MSDN声称它没有定义它可能抛出的任何异常列表.)
所以我假设缺失noexcept
可能是:a)错误,或b)运算符访问的基础数据类型可能抛出.选项a会很好,因为这意味着我可以标记自己的运算符noexcept
.选项b很难理解,因为所有操作员都会获得参考,并且它不会调用任何东西.
所以,长话短说,是否有任何unique_ptr::operator[]
抛出的可能性,从noexcept
函数中调用它是否安全?
我的代码中有一个警告让我发疯:
int vasprintf_wrapper(char** bufptr, const char* fmt, va_list ap)
{
// Do stuff...
// ...
return vasprintf(bufptr, fmt, ap);
}
Run Code Online (Sandbox Code Playgroud)
Clang(3.6.0),抱怨"格式字符串不是字符串文字",指的fmt
是正在转发的参数.
天真地,我试图:
return vasprintf(bufptr, reinterpret_cast<const char[]>(fmt), ap);
Run Code Online (Sandbox Code Playgroud)
哪个当然不编译.
我该怎么办?完全禁用警告不是一种选择.我想要警告.但在这种情况下,我想告诉编译器我知道我在做什么("着名的遗言"旁边的笑话......)
我想知道我是否可以使用通用迭代器来访问向量中的元素.我有不同的向量,但只有一个功能来显示元素.如果我可以有一个通用的迭代器,那么我的方法可以顺利运行.如果有可能请提供建议.
Point2,Point3,Line2,Line3是4个不同的类.该方法接受我在另一个方法中创建的向量对象.
template <typename VecObject>
void Display(VecObject v) {
if (filterCriteria == "Point2") {
vector<Point2>::iterator it;
} else if (filterCriteria == "Point3") {
} else if (filterCriteria == "Line2") {
} else if (filterCriteria == "Line3") {
}
for ( it = v.begin(); it!=v.end(); ++it) {
cout << *it << endl;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我以前做的更早,它的工作找到.我现在需要使用迭代器来实现
//for (int i = 0; i < v.size(); i++) {
// cout << v[i];
// }
Run Code Online (Sandbox Code Playgroud)