我想知道是否有人可以向我解释#pragma pack预处理器语句的作用,更重要的是,为什么人们会想要使用它.
我查看了MSDN页面,它提供了一些见解,但我希望能从有经验的人那里听到更多.我以前在代码中看过它,虽然我似乎无法找到它的位置.
我从来没有理解#pragma once什么时候#ifndef #define #endif总是有效的需要.
我已经看到了#pragma comment与其他文件链接的用法,但使用IDE可以更轻松地设置编译器设置.
有哪些其他用法#pragma是有用的,但并不广为人知?
编辑:
我不只是#pragma指令列表之后.也许我应该再多说一下这个问题:
你和你一起写的代码#pragma有用吗?
.
答案一目了然:
感谢所有回答和/或评论的人.以下是我发现有用的一些输入的摘要:
#pragma once或#ifndef #define #endif允许更快地编译大型系统.史蒂夫跳进来支持这一点.#pragma onceMSVC首选,而GCC编译器优化#ifndef #define #endif.因此,应该使用其中之一,而不是两者.#pragma pack了二进制兼容性,而Clifford则反对这一点,因为可移植性和字节序可能存在问题.Evan提供了一个示例代码,Dennis告知大多数编译器会强制执行填充以进行对齐.#pragma warning用来隔离真正的问题,并禁用已经审查过的警告.#pragma comment(lib, header)在不重新设置IDE的情况下轻松移植项目.当然,这不太便携.#pragma message为VC用户提供了一个很好的技巧来输出带有行号信息的消息.詹姆斯更进一步,允许error或warning匹配MSVC的消息,并将适当显示,如错误列表.#pragma region了能够在MSVC中使用自定义消息折叠代码.哇,等等,如果我想发布不使用#pragmas除非必要,该怎么办?
#pragma.荣誉.如果SOers感觉到发布答案的冲动,我会在此列表中添加更多内容.感谢大家!
可能重复:
#pragma - 帮助理解
我看过pragma很多次,但总是很困惑,任何人都知道它的作用?它只是窗户吗?
今天,我惊讶地发现了这一点
当sizeof运算符应用于类,结构或联合类型时,结果是该类型的对象中的字节数,以及为在单词边界上对齐成员而添加的任何填充.结果不一定与通过添加各个成员的存储要求而计算的大小相对应.
我不知道它,我很确定这个东西打破了我的一些旧代码:读取二进制文件,我曾经有这样的结构:
struct Header
{
union {
char identc[4];
uint32 ident;
};
uint16 version;
};
Run Code Online (Sandbox Code Playgroud)
并fread通过sizeof以下方式直接读取这6个字节:
fread( &header, sizeof(header), 1, f );
Run Code Online (Sandbox Code Playgroud)
但现在sizeof(header)回来了8!
是否有可能sizeof(header)返回旧的GCC版本6,或者我的想法完全消失了?
无论如何是否有任何其他运算符(或预处理器指令或其他)让编译器知道结构有多大 - 不包括填充?
否则,从一个不需要编写太多代码的文件中读取原始数据结构的干净方法是什么?
编辑:我知道这不是读取/写入二进制数据的正确方法:根据机器的字节顺序和内容,我会得到不同的结果.无论如何,这种方法是最快的方法,我是juist试图读取一些二进制数据以快速获取其内容,而不是编写一个我将在未来使用或发布的好应用程序.
我一直在研究 GCC 编译指示类型及其操作。但我意识到pragmas可以用来直接编译命令。我遇到的困惑是 # 操作是预处理的一部分,例如
#if DEBUG
/* statement one */
#elif RELEASE
/* statement two */
#endif
Run Code Online (Sandbox Code Playgroud)
如果激活调试模式,编译器甚至不会编译和检测语句二中的错误,但是#pragma如何直接向编译器发出命令?
另外,如果它控制编译器,有没有办法在没有#pragmas的情况下做到这一点?因为预处理之后只剩下C代码了。
这是SDL在Visual Studio 2005中需要的一些代码,以便我的简单程序能够运行.代码在做什么?我拥有它的唯一原因是因为我的导师告诉我把它放入并且从未解释过.
// what is this code doing?
//---------------------------------------------------------
#ifdef WIN32
#pragma comment(lib, "SDL.lib")
#pragma comment(lib, "SDLmain.lib")
#endif
//-------------------------------------------------------
#include <iostream>
#include "SDL.h"
using namespace std;
int main(int argc, char *argv[])
{
if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) == -1) {
cerr << "Failed to initialize SDL: " << SDL_GetError() << endl;
exit(1);
}
atexit(SDL_Quit);
system("pause");
return 0;
}
Run Code Online (Sandbox Code Playgroud)