Questions tagged «c-preprocessor»

在编译C和C ++语言程序之前应用的文本宏处理器。此标记还可以用于有关其他衍生自或具有相同功能的编译器/语言的问题,例如Objective-C或C#中的#指令。

8
在参数数量上重载宏
我有两个宏FOO2和FOO3: #define FOO2(x,y) ... #define FOO3(x,y,z) ... 我想定义一个新的宏FOO,如下所示: #define FOO(x,y) FOO2(x,y) #define FOO(x,y,z) FOO3(x,y,z) 但这是行不通的,因为宏不会在参数数量上重载。 无需修改FOO2和FOO3,是有一些方法来定义一个宏FOO(使用__VA_ARGS__或以其他方式),以获得分派的相同的效果FOO(x,y)来FOO2,并FOO(x,y,z)到FOO3?
183 c  macros  c-preprocessor 

30
C ++宏什么时候有益?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 2年前关闭。 改善这个问题 该ç预处理器有理由担心和C ++社区避之唯恐不及。内联函数,const和模板通常是的更安全和优越的替代方法#define。 以下宏: #define SUCCEEDED(hr) ((HRESULT)(hr) >= 0) 绝不优于安全类型: inline bool succeeded(int hr) { return hr >= 0; } 但是宏确实有其位置,请列出您在没有预处理器的情况下无法发现的宏用途。 请把每个用例放在一个单独的答案中,以便可以将其投票。如果您知道如何在没有预告的情况下获得答案之一,请指出该答案的注释方式。



6
__FILE __,__ LINE__和__FUNCTION__在C ++中的用法
假设您的C ++编译器支持它们,是否有任何特定的原因不使用__FILE__,__LINE__以及__FUNCTION__出于日志记录和调试的目的? 我主要关心的是为用户提供误导性数据,例如,由于优化而报告错误的行号或功能,或者因此而导致性能下降。 基本上,我可以信任__FILE__,__LINE__并__FUNCTION__以永远做正确的事?

2
如何用C预处理器连接两次并像“ arg ## _ ## MACRO”中那样扩展宏?
我正在尝试编写一个程序,其中某些函数的名称取决于具有这样的宏的某个宏变量的值: #define VARIABLE 3 #define NAME(fun) fun ## _ ## VARIABLE int NAME(some_function)(int a); 不幸的是,宏NAME()将其变成了 int some_function_VARIABLE(int a); 而不是 int some_function_3(int a); 因此,这显然是错误的解决方法。幸运的是,VARIABLE的不同可能值的数量很小,因此我可以简单地进行an #if VARIABLE == n并单独列出所有情况,但是我想知道是否有一种聪明的方法来做到这一点。

10
GCC的## __ VA_ARGS__技巧的标准替代方法?
C99中可变参数宏的空参数存在一个众所周知的 问题。 例: #define FOO(...) printf(__VA_ARGS__) #define BAR(fmt, ...) printf(fmt, __VA_ARGS__) FOO("this works fine"); BAR("this breaks!"); BAR()根据C99标准,上述的使用确实是不正确的,因为它将扩展为: printf("this breaks!",); 请注意结尾的逗号-不可行。 一些编译器(例如:Visual Studio 2010)将悄悄地为您消除尾随的逗号。其他编译器(例如:GCC)也支持放在##前面__VA_ARGS__,如下所示: #define BAR(fmt, ...) printf(fmt, ##__VA_ARGS__) 但是,是否存在符合标准的方法来实现此行为?也许使用多个宏? 现在,该##版本似乎受到了很好的支持(至少在我的平台上),但是我确实希望使用符合标准的解决方案。 先发制人:我知道我可以编写一个小函数。我正在尝试使用宏进行此操作。 编辑:这是为什么我想使用BAR()的示例(尽管很简单): #define BAR(fmt, ...) printf(fmt "\n", ##__VA_ARGS__) BAR("here is a log message"); BAR("here is a log message with a …

3
在C / C ++预处理器中,在其自己的行上加一个井号/井号(#)的目的是什么?
我一直在看Boost库的源代码,并且我注意到通常有单个磅号,但没有附加任何预处理程序指令。我通读了GCC预处理程序手册和规范指南,但找不到任何相关内容。 (1) #ifndef BOOST_CONFIG_HPP (2) # include <boost/config.hpp> (3) #endif (4) # (5) #if defined(BOOST_HAS_PRAGMA_ONCE) (6) # pragma once (7) #endif 在第4行,英镑符号后面没有任何内容。这有什么作用?它在C预处理程序(CPP)规范中定义吗? 由于Boost是跨平台的库,因此我认为任何CPP都应正确解析它。在整个代码中具有随机的磅/哈希符号会产生什么影响/副作用?
145 c++  c  boost  c-preprocessor 

17
将C程序中的文本文件“ #include”作为char []
有没有办法在编译时将整个文本文件作为字符串包含在C程序中? 就像是: file.txt: This is a little text file main.c: #include <stdio.h> int main(void) { #blackmagicinclude("file.txt", content) /* equiv: char[] content = "This is\na little\ntext file"; */ printf("%s", content); } 获得在stdout上打印的小程序“这是一个小文本文件” 目前,我使用了一个骇人的python脚本,但是它非常丑陋,并且仅限于一个变量名,您能告诉我另一种方法吗?

15
我应该使用#define,enum还是const?
在我正在研究的C ++项目中,我有一个标志类型的值,可以有四个值。这四个标志可以组合。标志描述数据库中的记录,可以是: 新纪录 删除记录 修改记录 现有记录 现在,对于每条记录,我希望保留此属性,因此可以使用一个枚举: enum { xNew, xDeleted, xModified, xExisting } 但是,在代码的其他位置,我需要选择对用户可见的记录,因此我希望能够将其作为单个参数传递,例如: showRecords(xNew | xDeleted); 因此,似乎我有三种可能的解决方法: #define X_NEW 0x01 #define X_DELETED 0x02 #define X_MODIFIED 0x04 #define X_EXISTING 0x08 要么 typedef enum { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } RecordType; 要么 namespace RecordType …



14
如何在编译时显示#define的值?
我试图找出我的代码认为正在使用的Boost版本。我想做这样的事情: #error BOOST_VERSION 但是预处理器不会扩展BOOST_VERSION。 我知道我可以在程序运行时将其打印出来,并且我可以查看预处理器的输出以找到答案。我觉得在编译过程中采取这种方式可能会很有用。

3
C / C ++宏字符串串联
#define STR1 "s" #define STR2 "1" #define STR3 STR1 ## STR2 是否可以串联STR3 ==“ s1”?您可以通过将args传递给另一个Macro函数来实现。但是有直接的方法吗?
121 c++  c  c-preprocessor 

4
如何从预处理器宏中识别平台/编译器?
我正在编写一个跨平台的代码,应该在linux,windows,Mac OS上编译。在Windows上,我必须支持Visual Studio和mingw。 有一些特定于平台的代码,应该放在#ifdef .. #endif环境中。例如,在这里我放置了win32特定的代码: #ifdef WIN32 #include <windows.h> #endif 但是如何识别linux和mac OS?我应该使用什么定义名称(或其他名称)?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.