相关疑难解决方法(0)

#pragma曾经安全包括后卫吗?

我已经读过使用时会有一些编译器优化,#pragma once这会导致更快的编译.我认为这是非标准的,因此可能造成跨平台兼容性问题.

这是非Windows平台(gcc)上大多数现代编译器支持的东西吗?

我想避免平台编译问题,但也想避免后备警卫的额外工作:

#pragma once
#ifndef HEADER_H
#define HEADER_H

...

#endif // HEADER_H
Run Code Online (Sandbox Code Playgroud)

我应该担心吗?我是否应该在这方面进一步消耗精力?

c++ include-guards

283
推荐指数
9
解决办法
15万
查看次数

在C中使用#pragma

#pragmaC中有哪些用途,有例子?

c pragma

107
推荐指数
7
解决办法
19万
查看次数

确定与其成员相关的C/C++结构的对齐方式

如果已知结构构件的对齐,是否可以找到结构类型的对齐?

例如.对于:

struct S
{
 a_t a;
 b_t b;
 c_t c[];
};
Run Code Online (Sandbox Code Playgroud)

是S = max(alignment_of(a),alignment_of(b),alignment_of(c))的对齐?

在网上搜索我发现"对于结构化类型,其任何元素的最大对齐要求决定了结构的对齐"(在每个程序员应该知道的内存中)但我在标准中找不到任何类似的东西(最新草稿更准确).


编辑: 非常感谢所有的答案,特别是罗伯特·甘博为原始问题提供了一个非常好的答案,以及其他贡献者.

简而言之:

为了确保结构构件的对准要求,结构的对准必须至少与其最严格构件的对准一样严格.

至于确定结构的对齐方式,我们提出了一些选项,经过一些研究,我发现了这个:

  • c ++ std :: tr1 :: alignment_of
    • 尚未标准,但关闭(技术报告1),应该在C++ 0x中
    • 最新草案中存在以下限制:前提条件:T应为完整类型,引用类型或未知范围的数组,但不应为函数类型或(可能是cv-qualified)void.
      • 这意味着我提出的使用C99灵活数组的用例将无法工作(这并不奇怪,因为灵活的数组不是标准的c ++)
    • 在最新的c ++草案中,它是用新关键字的术语定义的 - alignas(具有相同的完整类型要求)
    • 在我看来,如果c ++标准曾经支持C99灵活数组,那么要求可以放宽(结构与灵活数组的对齐不应该根据数组元素的数量而改变)
  • c ++ boost :: alignment_of
    • 主要是tr1替代品
    • 似乎是专门针对void而在这种情况下返回0(这在c ++草案中是禁止的)
    • 来自开发人员的注意事项:严格来说,您应该只依赖于ALIGNOF(T)的值是T的真实对齐的倍数,尽管在实践中它确实在我们所知道的所有情况下计算了正确的值.
    • 我不知道这是否适用于灵活的数组,它应该(可能不起作用,这解决了我的平台上的编译器内在因此我不知道它将如何在一般情况下表现)
  • Andrew Top提出了一个简单的模板解决方案,用于计算答案中的对齐方式
    • 这似乎与boost正在做的非常接近(如果它小于计算的对齐,则boost会另外返回对象大小,因为我可以看到相同的通知
    • 这适用于灵活的数组
  • 使用Windbg.exe找出符号的对齐方式
    • 不编译时,编译具体,没有测试它
  • 在包含该类型的匿名结构上使用offsetof
    • 看到答案,不可靠,不能用c ++非POD移植
  • 编译器内在函数,例如.MSVC __alignof
    • 适用于灵活的数组
    • alignof关键字在最新的c ++草案中

如果我们想要使用"标准"解决方案,我们只限于std :: tr1 :: alignment_of,但如果你将c ++代码与c99的灵活数组混合,这将不起作用.

我认为它只有一个解决方案 - 使用旧的struct hack:

struct S
{
 a_t a; …
Run Code Online (Sandbox Code Playgroud)

c c++ alignment

25
推荐指数
3
解决办法
1万
查看次数

出现在错误列表中的Visual C++的故意编译器警告?

如何在Visual C++中故意创建一个编译器警告(在#error模型中,除了作为警告),它将在错误列表中显示正确的文件和行号?

GCC和其他编译器提供#warning,但MSVC编译器没有.

http://support.microsoft.com/kb/155196上的"解决方案" 未在Visual Studio错误列表中进行解析.

c++ compiler-construction pragma compiler-warnings visual-studio

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

C++ 中的 #warning 预处理器

在 C# 中,我们可以使用 #warning 在错误窗口中显示警告。在 C++ 中#pragma message是这样的,但它只是输出一条消息而不是警告。

在 C++ (Window, Visual Studio) 中有没有办法故意向用户显示警告?

我试过这个 #warning DEBUG is defined

它给了我这个错误:

严重性说明项目文件行错误错误 C1021:无效的预处理器命令“警告”AecProject stdafx.h 49

c++ c-preprocessor

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

多余包含必要的警卫?

Codegear RAD Studio 2009中是否需要"冗余包括警卫"?编译器是否足够聪明,可以自行处理?

例如,我可能在foo.h中有以下'include guard':

#ifndef fooH
#define fooH
// ... declaration here
#endif
Run Code Online (Sandbox Code Playgroud)

以及use_foo.h中的以下'冗余包含保护':

#ifndef fooH
    #include "foo.h"
#endif
Run Code Online (Sandbox Code Playgroud)

此外,如果编译器不够智能,如果它们包含在源文件中,那么"冗余包括警卫"是必需的.例如use_foo.cpp.?

c++ include-guards include c++builder-2009

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

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

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

c ada pragma

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