我已经读过使用时会有一些编译器优化,#pragma once
这会导致更快的编译.我认为这是非标准的,因此可能造成跨平台兼容性问题.
这是非Windows平台(gcc)上大多数现代编译器支持的东西吗?
我想避免平台编译问题,但也想避免后备警卫的额外工作:
#pragma once
#ifndef HEADER_H
#define HEADER_H
...
#endif // HEADER_H
Run Code Online (Sandbox Code Playgroud)
我应该担心吗?我是否应该在这方面进一步消耗精力?
如果已知结构构件的对齐,是否可以找到结构类型的对齐?
例如.对于:
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))的对齐?
在网上搜索我发现"对于结构化类型,其任何元素的最大对齐要求决定了结构的对齐"(在每个程序员应该知道的内存中)但我在标准中找不到任何类似的东西(最新草稿更准确).
编辑: 非常感谢所有的答案,特别是罗伯特·甘博为原始问题提供了一个非常好的答案,以及其他贡献者.
简而言之:
为了确保结构构件的对准要求,结构的对准必须至少与其最严格构件的对准一样严格.
至于确定结构的对齐方式,我们提出了一些选项,经过一些研究,我发现了这个:
如果我们想要使用"标准"解决方案,我们只限于std :: tr1 :: alignment_of,但如果你将c ++代码与c99的灵活数组混合,这将不起作用.
我认为它只有一个解决方案 - 使用旧的struct hack:
struct S
{
a_t a; …
Run Code Online (Sandbox Code Playgroud) 如何在Visual C++中故意创建一个编译器警告(在#error模型中,除了作为警告),它将在错误列表中显示正确的文件和行号?
GCC和其他编译器提供#warning,但MSVC编译器没有.
http://support.microsoft.com/kb/155196上的"解决方案" 未在Visual Studio错误列表中进行解析.
c++ compiler-construction pragma compiler-warnings visual-studio
在 C# 中,我们可以使用 #warning 在错误窗口中显示警告。在 C++ 中#pragma message
是这样的,但它只是输出一条消息而不是警告。
在 C++ (Window, Visual Studio) 中有没有办法故意向用户显示警告?
我试过这个 #warning DEBUG is defined
它给了我这个错误:
严重性说明项目文件行错误错误 C1021:无效的预处理器命令“警告”AecProject stdafx.h 49
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
.?