小编Nik*_* C.的帖子

属性说明符序列是否继承?

看看这个片段:

struct [[nodiscard]] Result {
};


struct DiscardableResult: Result {
};
Run Code Online (Sandbox Code Playgroud)

是否DiscardableResult[[nodiscard]]属性?如果是,是否有可能以某种方式将其删除?

c++ language-lawyer c++11 c++14 c++17

19
推荐指数
1
解决办法
450
查看次数

在C中实现ls -al命令

作为我的一个类的赋值的一部分,我必须在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)

c linux ls file stat

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

将编译库链接到更新版本的glibc

我正在开发一个使用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 /的选项,但收效甚微.

谢谢!

c glibc shared-libraries ftdi

9
推荐指数
1
解决办法
1730
查看次数

是否可以创建C FILE对象以在内存中读/写

我正在使用一个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.

c++ memory file

9
推荐指数
1
解决办法
2959
查看次数

为什么没有命名空间限定符的std :: generate是可访问的?

编译好是正常的吗?

#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++ gcc namespaces clang c++11

9
推荐指数
1
解决办法
261
查看次数

来自另一个非静态的非静态成员初始化程序

很简单的问题.这是有效的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)

c++ gcc clang icc c++11

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

如何链接到旧版本的共享库

我正在我的计算机上构建我的程序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旧版本的符号链接是否有害?如果没有,它会解决我的问题吗?

c c++ linux shared-libraries

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

在哪种情况下std :: unique_ptr :: operator []会抛出?

我有一个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函数中调用它是否安全?

c++ unique-ptr language-lawyer noexcept c++11

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

更正"格式字符串不是字符串文字"警告

我的代码中有一个警告让我发疯:

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)

哪个当然不编译.

我该怎么办?完全禁用警告不是一种选择.我想要警告.但在这种情况下,我想告诉编译器我知道我在做什么("着名的遗言"旁边的笑话......)

c++ clang

6
推荐指数
2
解决办法
3031
查看次数

用于访问向量的通用迭代器

我想知道我是否可以使用通用迭代器来访问向量中的元素.我有不同的向量,但只有一个功能来显示元素.如果我可以有一个通用的迭代器,那么我的方法可以顺利运行.如果有可能请提供建议.

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)

c++ iterator stdvector

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