c-preprocessor相关内容

枚举和定义语句之间的区别

在 C/C++ 中使用 define 语句和 enum 语句有什么区别(在 C 或 C++ 中使用它们时有什么区别)? 例如,什么时候应该使用 enum {BUFFER = 1234}; 结束 #define BUFFER 1234 解决方案 enum 定义了一个语法元素. #define 是一个预处理器指令,在编译器看到代码之前执行,因此不是 C 本身的语言元素. 通 ..
发布时间:2021-12-29 16:21:35 C/C++开发

总是 sizeof(enum) == sizeof(int) 吗?

sizeof(enum) == sizeof(int),总是吗? 还是依赖于编译器? 这样说是不是错了,因为编译器针对字长(内存对齐)进行了优化,即 y int 是特定编译器上的字长?如果我使用枚举,这是否意味着没有处理惩罚,因为它们会字对齐? 如果我把所有的返回码放在一个枚举中不是更好吗,因为我显然不担心它得到的值,在检查返回类型时只关心名称.如果是这种情况,#DEFINE 不会更好, ..
发布时间:2021-12-29 16:12:01 其他开发

我应该使用#define、enum 还是const?

在我正在处理的 C++ 项目中,我有一个 flag 类型的值,它可以有四个值.这四个标志可以组合在一起.标志描述数据库中的记录,可以是: 新记录 删除记录 修改记录 现有记录 现在,对于我希望保留此属性的每条记录,我可以使用枚举: enum { xNew, xDeleted, xModified, xExisting } 但是,在代码的其他地方,我需要选择哪些记录对用户可见, ..
发布时间:2021-12-29 16:10:55 C/C++开发

有没有一种可移植的方式来打印来自 C 预处理器的消息?

我希望能够做类似的事情 #print "C 预处理器到了!" 用于调试目的.执行此操作的最佳/最便携方式是什么? 解决方案 warning 指令可能是最接近的指令,但它并不完全独立于平台: #warning "C 预处理器到了!" AFAIK 这适用于大多数编译器,除了 MSVC,你必须使用 pragma 指令: #pragma message(“C 预处理器到了!") ..
发布时间:2021-12-27 23:56:09 其他开发

通过 CMake 定义预处理器宏?

如何通过 CMake 定义预处理器变量? 等效的代码是 #define foo. 解决方案 很长一段时间,CMake 都有用于此目的的 add_definitions 命令.但是,最近该命令已被更细粒度的方法(用于编译定义、包含目录和编译器选项的单独命令)所取代. 使用新add_compile_definitions的示例: add_compile_definitions(O ..
发布时间:2021-12-26 21:28:21 C/C++开发

如何使用 C 预处理器编写 while 循环?

我是从教育/黑客的角度来问这个问题的(我真的不想这样编码). 是否可以仅使用 C 预处理器指令来实现 while 循环.我知道宏不能递归扩展,那么如何实现? 解决方案 查看Boost 预处理器 库,它允许您在预处理器中编写循环等等. ..
发布时间:2021-12-26 17:58:57 其他开发

C++ 模板实例化:避免长切换

我有一个依赖于整数模板参数的类.在我的程序中,我想使用此模板的一个实例,具体取决于运行时确定的此参数的值.这是一个简单的例子,演示了我目前将如何使用一个大的 switch 语句: #include #include #include 模板结构包装{typedef typename std::conditional::type DataType;数据类型内容[A];无效的 foo() {std:: ..
发布时间:2021-12-24 15:21:35 C/C++开发

我可以重新定义一个 C++ 宏然后再定义它吗?

我在我的代码中同时使用了 JUCE 库和一些 Boost 头文件.Juce 将“T"定义为宏(groan),而 Boost 在其模板定义中经常使用“T".结果是,如果您以某种方式在 Boost 头文件之前包含 JUCE 头文件,预处理器会在 Boost 代码中扩展 JUCE 宏,然后编译器就会无可救药地丢失. 在大多数情况下,保持我的包含顺序正确并不难,但是当您有一个包含其他一些类的 JUC ..
发布时间:2021-12-24 15:01:28 C/C++开发

编译时的偏移量

有没有办法在编译时找到结构成员的偏移量?我希望创建一个包含结构成员偏移量的常量.在以下代码中,offsetof() 宏在第一个 printf 语句中起作用.但是,在第 10 行中使用声明 ofs 会产生错误: “无法将 '->' 运算符解析为常量表达式". 还有其他方法吗? struct MyStruct{无符号长 lw;无符号字符 c[5];国际我;国际 j;未签名长尾;};con ..
发布时间:2021-12-23 17:07:56 其他开发

如何使用 C 预处理器将连接的字符串转换为宽字符?

我正在做一个项目,其中有许多由连接(数字等)组成的常量字符串. 例如,我有一个 LOCATION 宏,它可以将 __FILE__ 和 __LINE__ 格式化成一个字符串,我可以用它来知道我所在的位置打印消息或错误时的代码: #define _STR(x) # x#define STR(x) _STR(x)#define LOCATION __FILE__ "(" STR(__LINE__ ..
发布时间:2021-12-22 18:35:36 C/C++开发

如何查看 Visual C++ 预处理器的输出?

我想在我的代码上看到 Visual C++ 预处理器的输出——即等效于 gcc -E.对于我的生活,我找不到相关的编译器开关.我该如何实现? 解决方案 cl.exe,Microsoft Visual C++ 的命令行界面,具有三种不同的输出预处理文件的选项(因此不一致在之前关于 Visual C++ 的回复中): /E:预处理到标准输出(类似于 GCC 的 -E 选项) /P:预处 ..
发布时间:2021-12-22 18:34:09 C/C++开发

如何暂时禁用 C/C++ 中的宏扩展?

出于某种原因,我需要暂时禁用头文件中的一些宏,#undef MACRONAME 将使代码编译,但它会取消现有宏的定义. 有没有办法禁用它? 我应该提到您并不真正了解宏的值,而且我正在寻找交叉编译器解决方案(至少应该在 GCC 和 MSVC 中工作). 解决方案 在 MSVC 中,您可以使用 push_macro pragma, GCC 支持它与 Microsoft Window ..
发布时间:2021-12-22 18:31:56 C/C++开发

如何测试预处理器符号是否已#define'd 但没有值?

使用 C++ 预处理器指令,是否可以测试预处理器符号是否已定义但没有值?类似的东西: #define MYVARIABLE#if !defined(MYVARIABLE) ||#MYVARIABLE == ""……呜呜呜……#万一 编辑:我这样做的原因是因为我正在处理的项目应该通过 /DMYSTR=$(MYENVSTR)/DMYSTR=$(MYENVSTR),并且此字符串可能为空.如果用户忘记 ..
发布时间:2021-12-22 18:21:27 C/C++开发

MSVC++ 可变参数宏扩展

所以我有一个在 GCC 中运行良好的宏,但在 Microsoft 的 C++ 编译器中不起作用.我希望有人可能知道一种解决方法,或者可以向我解释为什么它会这样. 我确定这个宏并不完全是“标准的",但它确实对我有帮助. 这是宏的功能示例: #define VA_NARGS_IMPL(_1, _2, _3, _4, _5, N, ...) N#define VA_NARGS(...) V ..
发布时间:2021-12-22 18:15:32 C/C++开发

常量 C 表达式是在编译时还是在运行时计算?

如果我编写一个使用其他预处理器常量执行操作的 #define,那么每次宏在运行时出现时都会计算最终值吗?这是否取决于编译器中的优化,还是包含在标准中? 示例: #define EXTERNAL_CLOCK_FREQUENCY 32768#define TIMER_1_S EXTERNAL_CLOCK_FREQUENCY#define TIMER_100_MS TIMERB_1_S/10 ..

自定义 gcc 预处理器

你能给我一个编写自定义 gcc 预处理器的例子吗? 我的目标是用适当的 CRC32 计算值替换 SID("foo") 类似的宏.对于任何其他宏,我想使用标准的 cpp 预处理器. 看起来使用 -no-integrated-cpp -B 选项可以实现这个目标,但是我找不到任何简单的使用示例. 解决方案 警告:危险且丑陋的 hack.现在闭上眼睛 您可以通过在 gcc 命令行中添加 ..
发布时间:2021-12-18 23:22:05 其他开发

GCC、字符串化和内联 GLSL?

我想使用宏字符串化内联声明 GLSL 着色器字符串: #define STRINGIFY(A) #Aconst GLchar* vert = STRINGIFY(#版本 120\n属性 vec2 位置;无效主(){gl_Position = vec4( 位置, 0.0, 1.0 );}); 使用 VS2010 构建并运行良好,但无法在 gcc 上编译: 错误:预处理指令无效#version ..
发布时间:2021-12-18 23:08:36 C/C++开发

编译器错误“在令牌之前缺少二元运算符"是什么意思?意思是?

我最近在尝试使用 gcc 进行编译时遇到以下错误: 错误:在标记“("之前缺少二元运算符 Web 和 SO 搜索提出了此错误的几个具体示例,并更改了特定代码以修复它们.但是我没有找到什么条件导致这个错误的一般描述. gcc 何时以及为什么会发出此错误? 解决方案 这不是编译器错误,而是预处理器错误.当预处理器在尝试评估 #if 或 #elif 指令中的表达式时遇到无效语法 ..
发布时间:2021-12-18 23:02:29 其他开发

找出 GCC 包含的路径是什么

我正在尝试以编程方式在 Linux 上找到 #include 路径,据我所知,这实际上意味着找到 GCC 认为它是什么.(这是真的吗?Clang 是怎么做到的?) 根据http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html 部分组件涉及CPU架构和GCC版本;尤其是后者似乎很棘手;我想它可以通过运行 gcc --version 并解析输出(或 g ..
发布时间:2021-12-18 22:56:08 服务器开发