标签: c-preprocessor

C预处理器"字符串化"的对面

使用C预处理器时,可以像这样将字符串化为字符串:

#define TO_STRING(x) "a string with " #x
Run Code Online (Sandbox Code Playgroud)

所以使用时,结果如下:

TO_STRING(test) 将扩展到: "a string with test"

有没有办法做相反的事情?获取字符串文字作为输入参数并生成C标识符?例如:

TO_IDENTIFIER("some_identifier") 会扩大到: some_identifier

谢谢您的回答.

编辑:对于那些想知道我需要它的人:

我想通过字符串标识符来引用我的3D引擎的场景图中的节点,但同时避免在紧密循环中比较字符串.所以我想我会写一个简单的工具,它将在编译的预构建步骤中运行并搜索预定义的字符串 - 例如ID("something").然后,对于每个这样的令牌,它将计算括号之间的字符串的CRC32,并生成包含这些数字标识符的#defines的头文件.例如,对于字符串"something",它将是:

#define __CRC32ID_something 0x09DA31FB

然后,每个cpp文件将使用ID(x)宏包含生成的头文件.本ID("something")当然会扩大到__CRC32ID_something,所以在效果是什么,编译器会看到的是简单的整数标识符,而不是对人友好的字符串.当然,现在我只是满足于此,ID(something)但我认为使用引号会更有意义 - 一个不知道ID宏如何工作的程序员可以认为something没有引号是C标识符,而实际上这样的标识符不存在于所有.

c macros stringification c-preprocessor

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

宏中的"#ifdef"

可能重复:
#ifff在#define中

如何在宏内成功使用"#"字符?当我做那样的事情时,它会尖叫:

#define DO(WHAT)        \
#ifdef DEBUG        \                           
  MyObj->WHAT()         \       
#endif              \
Run Code Online (Sandbox Code Playgroud)

c++ c-preprocessor

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

Objective-C预处理器指令'if not'

我理解如何使用这样的预处理器指令:

#if SOME_VARIABLE
    // Do something
#else
    // Do something else
#endif
Run Code Online (Sandbox Code Playgroud)

但是,如果我只想做某事,如果不是SOME_VARIABLE那会怎么样呢.

显然我仍然可以这样做:

#if SOME_VARIABLE

#else
    // Do something else
#endif
Run Code Online (Sandbox Code Playgroud)

...离开if,但有没有办法:

#if not SOME_VARIABLE
   // Do something
#endif
Run Code Online (Sandbox Code Playgroud)

这里的 Apple文档没有提示,但这似乎是一个非常基本的需求.

基本上我想做预处理器相当于:

if(!SOME_VARIABLE)(
{
   // Do Something
}
Run Code Online (Sandbox Code Playgroud)

iphone objective-c ios c-preprocessor preprocessor-directive

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

#if和#ifdef Objective-C预处理器宏有什么区别?

如何在构建设置中定义预处理器宏,如IPAD_BUILD和IPHONE_BUILD(以及如何在我的工厂方法中使用它们)?

我现在正在用这些,想知道背后会发生什么事情会很酷.

macros objective-c conditional-compilation ios c-preprocessor

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

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

C++ #include语义

对于相同的预处理指令,这是一个多重问题.

1 - <>或""?

除了在MSDN中找到的信息:

#include指令(C-C++)

1.a:两种符号之间有什么区别?
1.b:所有编译器都以同样的方式实现它们吗?
1.c:你什么时候使用<>,什么时候会使用""(即你用什么标准来使用一个或另一个标题包括在内)?

2 - #include {TheProject/TheHeader.hpp}或{TheHeader.hpp}?

我已经看到至少有两种写作方式包括一个项目标题.考虑到您至少有4种类型的标题,即:

  • 您项目的私有标题?
  • 您的项目的标题,但导出符号(因此,"公共")
  • 模块链接的另一个项目的标题
  • 编译器或标准库的标头

对于每种标题:

2.a:你会用<>或""吗?
2.b:您是否只使用{TheProject/TheHeader.hpp}或{TheHeader.hpp}?

3 - 奖金

3.a:你是否在一个类似树的组织中使用源和/或标题的项目(即目录中的目录,而不是"一个目录中的每个文件"),有什么优点/缺点?

c++ c-preprocessor

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

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

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

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

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

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

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

宏中的波浪号(〜)是什么意思?

此站点上看到,代码显示了使用括号中的波浪号进行的宏调用:

HAS_COMMA(_TRIGGER_PARENTHESIS_ __VA_ARGS__ (~))
//                                          ^^^
Run Code Online (Sandbox Code Playgroud)

它是什么意思/做什么?我怀疑它只是一个空洞的争论,但我不确定.它是否特定于C(99),就像__VA_ARGS__C99特有的并且存在于C++中一样?

c c++ tilde c-preprocessor

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

错误:粘贴"." 并且"red"不提供有效的预处理令牌

我正在实现X宏,但我有一个简单的宏扩展问题.通过在this文章中包含,该宏(见下文)用于几个宏用法示例.编译器给出了一条错误消息,但我可以通过使用-E带有GCC编译器的标志来查看有效的C代码.

宏X列表定义如下:

#define LIST \
  X(red, "red") \
  X(blue, "blue") \
  X(yellow, "yellow")
Run Code Online (Sandbox Code Playgroud)

然后:

#define X(a, b) foo.##a = -1;
  LIST;
#undef X
Run Code Online (Sandbox Code Playgroud)

但是gcc给出了以下错误消息:

lixo.c:42:1: error: pasting "." and "red" does not give a valid preprocessing token
lixo.c:42:1: error: pasting "." and "blue" does not give a valid preprocessing token
lixo.c:42:1: error: pasting "." and "yellow" does not give a valid preprocessing token
Run Code Online (Sandbox Code Playgroud)

就像我说的,我可以通过使用-Egcc上的开关看到有效的C代码:

lixo.c:42:1: error: pasting "." and "red" does not give a …
Run Code Online (Sandbox Code Playgroud)

c macros c-preprocessor

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

如何在C++预处理器中检测g ++和MinGW?

我想做的事情如下:

#ifdef GCC
#define GetFunctionName() string("My function name is ") + __PRETTY_FUNCTION__;
#endif
Run Code Online (Sandbox Code Playgroud)

由于我想使用漂亮的PRETTY_FUNCTION,据我所知只有gnu支持所以我需要检测我是否正在编译g ++和MinGW,我该怎么做?我猜我需要知道的是编译器的预处理器定义,就像我在下面为Microsoft做的那样.

#ifdef WIN32
#define LogFuncBegin() gLogger.FuncBegin( __FUNCTION__ );
#define LogFuncEndSuccess() gLogger.FuncEndSuccess( __FUNCTION__ );
#endif
Run Code Online (Sandbox Code Playgroud)

如何在C++预处理器中检测g ++和MinGW?

c++ gnu mingw g++ c-preprocessor

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