相关疑难解决方法(0)

#pragma pack效果

我想知道是否有人可以向我解释#pragma pack预处理器语句的作用,更重要的是,为什么人们会想要使用它.

我查看了MSDN页面,它提供了一些见解,但我希望能从有经验的人那里听到更多.我以前在代码中看过它,虽然我似乎无法找到它的位置.

c c-preprocessor pragma-pack

212
推荐指数
4
解决办法
19万
查看次数

您使用#pragma编写的代码有什么用?

我从来没有理解#pragma once什么时候#ifndef #define #endif总是有效的需要.

我已经看到了#pragma comment与其他文件链接的用法,但使用IDE可以更轻松地设置编译器设置.

有哪些其他用法#pragma是有用的,但并不广为人知?

编辑:

只是#pragma指令列表之后.也许我应该再多说一下这个问题:

你和你一起写的代码#pragma有用吗?

.

答案一目了然:

感谢所有回答和/或评论的人.以下是我发现有用的一些输入的摘要:

  • Jason建议使用#pragma once#ifndef #define #endif允许更快地编译大型系统.史蒂夫跳进来支持这一点.
  • 280Z28领先并提到#pragma onceMSVC首选,而GCC编译器优化#ifndef #define #endif.因此,应该使用其中之一,而不是两者.
  • Jason还提到#pragma pack了二进制兼容性,而Clifford则反对这一点,因为可移植性和字节序可能存在问题.Evan提供了一个示例代码,Dennis告知大多数编译器会强制执行填充以进行对齐.
  • sblom建议#pragma warning用来隔离真正的问题,并禁用已经审查过的警告.
  • Evan建议#pragma comment(lib, header)在不重新设置IDE的情况下轻松移植项目.当然,这不太便携.
  • sbi #pragma message为VC用户提供了一个很好的技巧来输出带有行号信息的消息.詹姆斯更进一步,允许errorwarning匹配MSVC的消息,并将适当显示,如错误列表.
  • Chris提供#pragma region了能够在MSVC中使用自定义消息折叠代码.

哇,等等,如果我想发布使用#pragmas除非必要,该怎么办?

  • 克利福德从另一个角度发布了关于使用的观点#pragma.荣誉.

如果SOers感觉到发布答案的冲动,我会在此列表中添加更多内容.感谢大家!

c++ compiler-construction pragma

22
推荐指数
4
解决办法
7603
查看次数

#pragma曾经在C中意味着什么?

可能重复:
#pragma - 帮助理解

我看过pragma很多次,但总是很困惑,任何人都知道它的作用?它只是窗户吗?

c pragma

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

C/C++获得结构大小

今天,我惊讶地发现了这一点

当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试图读取一些二进制数据以快速获取其内容,而不是编写一个我将在未来使用或发布的好应用程序.

c c++ size sizeof data-structures

11
推荐指数
1
解决办法
6999
查看次数

为什么#pragma 被视为预处理器指令?

我知道它以 开头#,并且遵循预处理指令格式。但是预处理器真的关心它吗?的#pragma pack#pragma once和其他所有的指令,我知道,都是由编译器进行。这个问题中的评论甚至指出#pragma指令在预处理阶段仍然存在。所以我的问题是:

  1. 既然#pragma是编译器,为什么它被认为是一个预处理指令?仅仅是因为它以 开头#吗?
  2. 预处理器真的对#pragma?

c preprocessor pragma

6
推荐指数
1
解决办法
203
查看次数

C#pragma是预处理还是编译时操作?

我一直在研究 GCC 编译指示类型及其操作。但我意识到pragmas可以用来直接编译命令。我遇到的困惑是 # 操作是预处理的一部分,例如

#if DEBUG
 /* statement one */
#elif RELEASE
 /* statement two */
#endif
Run Code Online (Sandbox Code Playgroud)

如果激活调试模式,编译器甚至不会编译和检测语句二中的错误,但是#pragma如何直接向编译器发出命令?

另外,如果它控制编译器,有没有办法在没有#pragmas的情况下做到这一点?因为预处理之后只剩下C代码了。

c compiler-construction c-preprocessor

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

任何人都可以告诉我使用pragma语句

任何人都可以告诉我在C和Ada中使用pragma,如果可能的话还有一些例子.

c ada pragma

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

这段代码是什么意思?

这是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)

c++ dll sdl

0
推荐指数
2
解决办法
1114
查看次数