标签: c-preprocessor

转义#define宏中的#符号?

在没有进入血腥细节的情况下,我想使用一个#define扩展为a 的宏,#include但是'#'符号会混淆预处理器(因为它认为我想引用一个参数.)

例如,我想做这样的事情:

#define MACRO(name) #include "name##foo"
Run Code Online (Sandbox Code Playgroud)

并使用它:

MACRO(Test)
Run Code Online (Sandbox Code Playgroud)

这将扩展到:

#include "Testfoo"
Run Code Online (Sandbox Code Playgroud)

简单的#符号导致预处理器进入barf.MinGW给我以下错误:

'#' is not followed by a macro parameter

我想我需要逃避#符号,但如果这是可能的话,我不会.

是的,宏确实很邪恶......

c c++ macros c-preprocessor preprocessor-directive

37
推荐指数
5
解决办法
3万
查看次数

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

出于某种原因,我需要暂时禁用头文件中的某些宏,这#undef MACRONAME将使代码编译,但它将取消现有的宏.

有没有一种方法可以禁用它?

我应该提到你并不真正了解宏的值,而且我正在寻找交叉编译器解决方案(至少应该在GCC和MSVC中工作).

c++ gcc visual-c++ c-preprocessor

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

错误:宏名称必须是使用#ifdef 0的标识符

我有用C++编写的应用程序的源代码,我只想用以下方法评论:

#ifdef 0
...
#endif
Run Code Online (Sandbox Code Playgroud)

我得到了这个错误

错误:宏名称必须是标识符

为什么会这样?

c++ macros c-preprocessor

36
推荐指数
3
解决办法
9万
查看次数

是否有任何宏来确定我的代码是否正在编译到Windows?

我想检测我正在编译的操作系统是否是Windows.是否有一个简单的宏我可以检查以验证?

c c++ operating-system c-preprocessor

36
推荐指数
5
解决办法
5万
查看次数

“#define X X”是什么意思?

在 Linux 头文件中epoll.h,我找到了以下代码:

enum EPOLL_EVENTS
{
    EPOLLIN = 0x001,
#define EPOLLIN EPOLLIN
...
}
Run Code Online (Sandbox Code Playgroud)

这是什么意思#define EPOLLIN EPOLLIN

c c++ linux idioms c-preprocessor

36
推荐指数
2
解决办法
1796
查看次数

预处理器输出

在将C预处理器转换为目标文件之前,如何查看C预处理器生成的输出?

我想看看MACRO定义对我的代码做了什么.

macros gcc c-preprocessor

35
推荐指数
5
解决办法
3万
查看次数

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

使用C++预处理程序指令,是否可以测试是否已定义预处理程序符号但没有值?像这样的东西:

#define MYVARIABLE
#if !defined(MYVARIABLE) || #MYVARIABLE == ""
... blablabla ...
#endif
Run Code Online (Sandbox Code Playgroud)

编辑:我这样做的原因是因为我正在处理的项目应该从环境中获取一个字符串/DMYSTR=$(MYENVSTR),这个字符串可能是空的.如果用户忘记定义此字符串,我想确保项目无法编译.

c++ visual-c++ c-preprocessor

35
推荐指数
4
解决办法
3万
查看次数

我在哪里可以了解#ifdef?

我看到这经常用于使模块与GHC和Hugs兼容,但谷歌并没有帮助我更多地了解它.

我可以在条件中加入什么?我可以根据正在使用的"基础"版本来制作模块的一部分吗?

编辑3/2017:这是一个很好的资源:https://guide.aelve.com/haskell/cpp-vww0qd72

haskell ghc c-preprocessor

35
推荐指数
3
解决办法
8500
查看次数

包含#include指令的宏定义

有没有办法定义一个#include 在其体内包含指令的宏?

如果我只是把" #include",它给出了错误

C2162: "expected macro formal parameter"
Run Code Online (Sandbox Code Playgroud)

因为在这里我不是#用来连接字符串.
如果我使用" \# include",那么我收到以下两个错误:

error C2017: illegal escape sequence
error C2121: '#' : invalid character : possibly the result of a macro expansion
Run Code Online (Sandbox Code Playgroud)

有帮助吗?

c c++ macros c-preprocessor

34
推荐指数
5
解决办法
3万
查看次数

任何测试扩展C/C++ #define宏的实用程序?

看起来我经常花太多时间试图让#define宏完全按照我的意愿去做.我将在下面发布我目前的困境,任何帮助表示赞赏.但真正更大的问题是,是否有人可以推荐的任何实用程序,以快速显示宏实际上在做什么?如果我看到错误的话,即使是缓慢的试错过程似乎会更快.

目前,我正在从我制作的DLL动态加载一长串函数.我设置的方式,函数指针与导出的函数具有相同的nanes,并且用于原型化的typedef具有相同的名称,但具有前置下划线.所以我想使用一个define来简化长长的函数指针列表的赋值.

例如,在下面的代码语句中,'hexdump'是typedef'd函数点的名称,也是函数的名称,而_hexdump是typedef的名称.如果GetProcAddress()失败,则递增失败计数器.

if (!(hexdump = (_hexdump)GetProcAddress(h, "hexdump"))) --iFail;
Run Code Online (Sandbox Code Playgroud)

所以,假设我想用宏来替换上面的每一行,就像这样......

GETADDR_FOR(hexdump )
Run Code Online (Sandbox Code Playgroud)

那么这是迄今为止我提出的最好的.它不起作用(我的//注释只是为了防止消息中的文本格式化)...

// #define GETADDR_FOR(a) if (!(a = (#_#a)GetProcAddress(h, "/""#a"/""))) --iFail; 
Run Code Online (Sandbox Code Playgroud)

而且,虽然我很了解我已经犯下了什么愚蠢的错误,但是通过简单地插入我的宏,这将使我的日子能够显示出我的方式错误.

c++ macros c-preprocessor

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