当一个指针到特定类型的(比如int,char,float,..)被递增,其值增加该数据类型的大小.如果void指向大小数据的指针x递增,它如何获得指向x前面的字节?编译器如何知道添加x指针的值?
我想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
以下代码(包含恶意错误)在没有任何警告的情况下编译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中宏的替换(扩展),例如(free)(p),free无论是否free定义了宏,都会调用该函数.我在C99标准中没有提到这一点(它就在那里,见答案),我观察到了这一点MSVS 2013也没有实现它.根据答案添加:它确实如同标准所要求的那样,即仅用于类似函数的宏,其扩展由后续' (' 触发并因此被干预' )' 抑制.
我是在做梦,还是有这样的可能性?如果有的话,撤回它的理由是什么?或只出现在某些方言?
在我的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)在我的源文件中的几个地方尝试过,但警告仍然存在.
可靠地禁用此消息的唯一方法似乎是关闭项目设置中的启用浏览信息,但我的感觉是我不应该这样做.
我正在研究库的多线程实现.在该库的一个模块中,存在一些全局变量(在程序执行中经常使用).为了更安全地访问这些变量,我使用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 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实例中复制字符串时,第二次尝试在同一点失败.
所以:
它经常注意到,如果有一种方法可以创建一个"虚拟FILE"并为缓冲区已满,请求输入,关闭,刷新等事件附加必要的回调,我本可以优雅地解决C中的实际问题.然后应该可以使用大部分stdio.h功能,例如fprintf不变.有没有一个框架可以做到这一点?如果没有,至少在某些平台上,是否可以通过适度的努力?
可能的应用是:
FILE.#include).我对特定案例的解决方案不太感兴趣,而不是在框架中让你自己动手FILE.我也不是在寻找虚拟文件系统,而是寻找FILE*可以传递给CRT 的虚拟文件系统.
令我失望的是,我从未见过任何类似的东西; 据我所知,C11 FILE完全取决于语言实现者,如果你希望保持语言(+库)规范的小而且将它与Java I/O流进行比较,这可能是合理的.
我确信虚拟FILEs必须可以与C运行时的任何(完全)开源实现,但我想可能有大量的细节使它比看起来更棘手,如果它已经完成它重复努力将是一种耻辱.不必修改CRT代码也是非常可取的.如果没有开源,我们可能会对所提供的功能进行逆向工程,但我担心结果太容易受到不支持功能的影响,除非有对一组接口的承诺.我想也是任何可以编写设备驱动程序的系统都可以创建一个虚拟设备,但我怀疑它是不必要的低级别并且需要一个人编写特权代码.
我不得不承认,虽然我的代码可以从虚拟代码中受益FILE,但我目前没有要求它; 尽管如此,这是我经常想知道的事情,我想其他人可能会感兴趣.
这有点类似于a-reader-interface-consumes-files-and-char-in-c,但提问者不希望返回虚拟FILE; 然而,答案是,使用fmemopen了.
为了比较任何字符串而不考虑它们的情况,有各种C库函数,如strcasecmp(),stricmp()和stricmpi().这些有什么区别?