小编usr*_*usr的帖子

C typedef指向结构的指针

我遇到过以下代码:

typedef struct {
        double x;
        double y;
        double z;
} *vector;
Run Code Online (Sandbox Code Playgroud)

这是一个有效的类型定义吗?代码编译并运行正常.如果这是常见做法,我只是好奇.

c struct pointers typedef

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

通过在派生类中使其成为纯虚函数来"隐藏"基类虚函数是否有效?

考虑这个例子:

#include <iostream>

class A {
    public:
    virtual void f();
};

void A::f()
{
    std::cout << "f() from A\n";
}

class B: public A {
    public:
    virtual void f() = 0;
};

class C: public B {
    public:
    void f();
};

void C::f()
{
    std::cout << "f() from C\n";
}

int main()
{
    C o;
    o.f();
}
Run Code Online (Sandbox Code Playgroud)

A::f()实现从C类"隐藏",它提供了自己的实现f()- 有效地使A::f()或多或少无意义.我认为这种类层次结构设计没什么价值,但我的问题是这是一个有效的C++还是只是"有效"(例如未定义的行为)?

c++ language-lawyer c++11

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

究竟什么是C中的翻译单元

翻译单元的常用定义是预处理之后(头文件包含,宏等与源文件一起).这个定义相当清楚,C标准5.1.1.1,C11说:

AC程序不需要全部同时翻译.该程序的文本保存在本国际标准中称为源文件(或预处理文件)的单元中.源文件以及通过预处理指令包含的所有头文件和源文件#include称为预处理转换单元.在预处理之后,预处理翻译单元被称为翻译单元.

更仔细地阅读第一句话:

AC程序不需要全部同时翻译.

这意味着(对我来说),C程序可以在同一个程序进行翻译,而不必将它们分成多个预处理源文件.同样在同一段的末尾,标准说:

翻译单元可以单独翻译,然后链接以产生可执行程序.

可以(通常是)解释为编译单个目标文件,然后最终链接它们以生成单个可执行程序.但是,如果可以从上述语句中提出问题并询问:这是否意味着实现可以自由地将多个源文件视为单个翻译单元,尤其是对于以下调用:

gcc file1.c file2.c -o out
Run Code Online (Sandbox Code Playgroud)

编译器可以访问整个源?

特别是,如果某个实现将file1.c+ file2.c(上述)视为单个翻译单元,是否可以将其视为不合格?

c language-lawyer

17
推荐指数
4
解决办法
2334
查看次数

是否正在评估指向超出对象存储的指针未定义?

考虑一下代码片段:

int main(void)
{
   int i = 42;
   int *p = &i;

   ++p; // Is this pointer evaluation undefined?
   *p = 5; // How about this?

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

指针的评估++p是不正确的?

C标准(C11,6.5.6)允许评估指向数组对象的一个末端的指针?这是否也适用于非数组对象?

c pointers c11

2
推荐指数
1
解决办法
110
查看次数

什么是ARM指令相当于英特尔的xchgl?

我发现LDREX并且STREX可能是使用的那些.但它们是两个指令(因此不提供原子性xchgl).我想原子交换的值是32位值.能LDREXSTREX在提供32位值的原子交换的方式使用,或者是他们其他的方式来实现它(只要它适用于armv7l或更高版本)?

通常,我使用gcc的原子内置函数或更新的(C++ 11等效)内置函数 来进行此类原子操作.但在这种情况下,我必须在C中使用内联汇编(将基于x86的futex实现移植到ARM体系结构).谢谢!

x86 assembly gcc arm

2
推荐指数
1
解决办法
434
查看次数

标签 统计

c ×3

language-lawyer ×2

pointers ×2

arm ×1

assembly ×1

c++ ×1

c++11 ×1

c11 ×1

gcc ×1

struct ×1

typedef ×1

x86 ×1