小编PJT*_*ill的帖子

C中空指针的指针算法

当一个指针到特定类型的(比如int,char,float,..)被递增,其值增加该数据类型的大小.如果void指向大小数据的指针x递增,它如何获得指向x前面的字节?编译器如何知道添加x指针的值?

c pointers void-pointers pointer-arithmetic

162
推荐指数
7
解决办法
11万
查看次数

平台无关size_t c中的格式说明符?

我想size_t在C中打印出一个类型的变量,但似乎size_t在不同的体系结构上别名为不同的变量类型.例如,在一台计算机(64位)上,以下代码不会抛出任何警告:

size_t size = 1;
printf("the size is %ld", size);
Run Code Online (Sandbox Code Playgroud)

但在我的另一台机器(32位)上面的代码会产生以下警告消息:

警告:格式'%ld'需要类型'long int*',但参数3的类型为'size_t*'

我怀疑这是由于指针大小的不同,所以在我的64位机器size_t上别名为a long int("%ld"),而在我的32位机器size_t上别名为另一种类型.

是否有专门用于的格式说明符size_t

c size-t platform-independent format-specifiers format-string

76
推荐指数
2
解决办法
4万
查看次数

是否有一个GCC选项来警告写"this-field"而不是`this-> field`?

以下代码(包含恶意错误)在没有任何警告的情况下编译GCC.但是,当然,它不像开发人员(我)那样工作.

#include <iostream>

struct A
{
    bool b;
    void set(bool b_) { this->b = b_; }
    bool get() const { return this-b; } // The bug is here: '-' instead of '->'
};

int main()
{
    A a;
    a.set(true);
    std::cout << a.get() << std::endl; // Print 1
    a.set(false);
    std::cout << a.get() << std::endl; // Print 1 too...
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我可以为编译器添加哪个警告(GCC 4.8)以避免这种错误?

链接问题:是否有任何强制(或警告)访问成员变量/函数的选项this->

c++ gcc gcc-warning

62
推荐指数
3
解决办法
5084
查看次数

可以(或可以)通过将名称括在括号中来抑制C中的宏替换

我似乎记得可以通过将宏名称放在括号中来抑制C中宏的替换(扩展),例如(free)(p),free无论是否free定义了宏,都会调用该函数.我在C99标准中没有提到这一点(它就在那里,见答案),我观察到了这一点MSVS 2013也没有实现它.根据答案添加:它确实如同标准所要求的那样,即仅用于类似函数的宏,其扩展由后续' (' 触发并因此被干预' )' 抑制.

我是在做梦,还是有这样的可能性?如果有的话,撤回它的理由是什么?或只出现在某些方言?

c macros

10
推荐指数
1
解决办法
155
查看次数

如何处理BK4504警告

在我的C++项目中设置了警告级别4,我看到以下内容:

警告1警告BK4504:文件包含太多引用; 忽略来自此源的进一步引用c:\ program files(x86)\ windows kits\8.1\include\um\mshtml.h 37492

mshtml.h 在我的项目的External Dependencies文件夹中列出,据我所知,它似乎是Microsoft提供的标头,作为Windows 8.1 SDK的一部分.

我是一名新手程序员,我对此的研究表明,mshtml.h的问题超出了64,000的符号引用限制,此时BCSMAKE引发了它产生此消息.

简单地忽略这个警告是否安全?我知道可以使用#pragma指令禁用特定警告,但是我在哪里放置此指令?我已经#pragma warning(disable: 4504)在我的源文件中的几个地方尝试过,但警告仍然存在.

可靠地禁用此消息的唯一方法似乎是关闭项目设置中的启用浏览信息,但我的感觉是我不应该这样做.

c++ warnings visual-studio

8
推荐指数
1
解决办法
4891
查看次数

C - __declspec(线程)变量表现

我正在研究库的多线程实现.在该库的一个模块中,存在一些全局变量(在程序执行中经常使用).为了更安全地访问这些变量,我使用Thread-local storage(TLS)关键字声明它们__declspec(thread).

这是对库外部函数的调用.此函数使用具有全局变量的模块:

for(i = 0; i<n_cores; i++)
    hth[i] = (HANDLE)_beginthread((void(*)(void*))MT_Interface_DimenMultiCells,0,(void*)&inputSet[i]);
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我猜每个线程都会复制库中使用的所有变量.

当我在x8内核处理器上运行程序时,完成操作所需的时间不会超过单个进程实现所需时间的1/3.

我知道不可能达到1/8的时间,但我认为至少1/6是可以达到的.

问题是:那些__declspec(线程)变量是如此糟糕表现的原因?

在此先感谢,GB

c performance multithreading declspec

4
推荐指数
2
解决办法
1639
查看次数

使用malloc()初始化类

当从C malloc保留内存时,应该如何使用c ++类?

我正在使用一个C库(lua),我需要向它公开一个C++类,在这种情况下,为了垃圾收集这些保留空间,lua进行内存预留.

下面是一个更简单的类似场景:

#include <string>

class Clase{
private:
    std::string valor;
public:
    Clase(){}
    Clase(const std::string & valor) : valor(valor){}
    const std::string & get() const { return this->valor; }
    void set(const std::string & valor){ this->valor = valor;}
    ~Clase(){}
};

typedef struct
{
    Clase cls;
}Estructura;

int main(int argc, char ** argv)
{
    Estructura * est = (Estructura *) malloc(sizeof(Estructura));

    est->cls.set("Hola");   // First attempt

    Clase myCls;   // Second attempt
    est->cls = myCls;

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

我理解并检查过,使用malloc不会调用类构造函数; 这是预期的,因此无法使用无效实例(Class中的字符串)调用copy(assign)运算符.我怀疑在Class实例中复制字符串时,第二次尝试在同一点失败.

所以:

  • 是否可以正确初始化由malloc保留其内存的类实例?
  • 什么其他警告?,vtables?
  • 对malloc的免费补充会留下内存泄漏吗?(我猜测由于Clase析构函数不会被调用,字符串将无法正确释放?[我假设该字符串在实例本身之外保存内存]) …

c c++ malloc lua new-operator

4
推荐指数
1
解决办法
886
查看次数

虚拟化C的FILE*接口有多可行?

它经常注意到,如果有一种方法可以创建一个"虚拟FILE"并为缓冲区已满,请求输入,关闭,刷新等事件附加必要的回调,我本可以优雅地解决C中的实际问题.然后应该可以使用大部分stdio.h功能,例如fprintf不变.有没有一个框架可以做到这一点?如果没有,至少在某些平台上,是否可以通过适度的努力?

可能的应用是:

  • 写入或读取动态或静态内存区域.
  • 并行写入多个文件.
  • 从生成数据的线程或协同例程中读取.
  • 将过滤器应用于另一个(虚拟或真实)FILE.
  • 支持间接的文件格式(如#include).
  • AC预处理器(?).

我对特定案例的解决方案不太感兴趣,而不是在框架中让你自己动手FILE.我也不是在寻找虚拟文件系统,而是寻找FILE*可以传递给CRT 的虚拟文件系统.

令我失望的是,我从未见过任何类似的东西; 据我所知,C11 FILE完全取决于语言实现者,如果你希望保持语言(+库)规范的小而且将它与Java I/O流进行比较,这可能是合理的.

我确信虚拟FILEs必须可以与C运行时的任何(完全)开源实现,但我想可能有大量的细节使它比看起来更棘手,如果它已经完成它重复努力将是一种耻辱.不必修改CRT代码也是非常可取的.如果没有开源,我们可能会对所提供的功能进行逆向工程,但我担心结果太容易受到不支持功能的影响,除非有对一组接口的承诺.我想也是任何可以编写设备驱动程序的系统都可以创建一个虚拟设备,但我怀疑它是不必要的低级别并且需要一个人编写特权代码.

我不得不承认,虽然我的代码可以从虚拟代码中受益FILE,但我目前没有要求它; 尽管如此,这是我经常想知道的事情,我想其他人可能会感兴趣.

这有点类似于a-reader-interface-consumes-files-and-char-in-c,但提问者不希望返回虚拟FILE; 然而,答案是,使用fmemopen了.

c virtualization file-io crt

4
推荐指数
1
解决办法
162
查看次数

为什么有多个C函数用于不区分大小写的比较

为了比较任何字符串而不考虑它们的情况,有各种C库函数,如strcasecmp(),stricmp()stricmpi().这些有什么区别?

c string posix crt msvcrt

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