c-preprocessor相关内容
我正在编写一些代码来连接用 C 编写的现有库.在我的 Rust 代码中,我希望能够使用来自 CPP 宏的值.如果我有一个如下所示的 C include.h: #define INIT_FLAG 0x00000001 我希望能够像这样在 Rust 中使用它: #[link(name="mylib")]外部{发布静态 init_flag: c_int = INIT_FLAG;} 我查看了其他
..
如何在编译时使用 gcc 取消定义编译器宏.我尝试了一些编译参数到 gcc,比如 -D,但我看不到“未定义"消息. 谢谢 #include #define MYDEF诠释主要(){#ifdef MYDEFstd::cout 解决方案 您可以在 gcc 中使用 -U 选项,但它不会取消定义源代码中定义的宏.据我所知,没有办法做到这一点.
..
我想知道这段代码输出背后的原因.我想不出答案. #define f(a,b) a##b#定义 g(a) #a#define h(a) g(a)无效的主要(){printf("%s %s",h(f(1,2)),g(f(1,2)));} PS:输出是 12 f(1,2).我以为是 12 12 或 f(1,2) f(1,2). 解决方案 h(f(1,2)) f(1,2) 代替 a.a 不是
..
最初我认为我需要这个,但我最终避免了它.然而,我的好奇心(以及对知识的渴望,哼)让我问: 可以一个预处理器宏,例如 #include "MyClass.h"INSTANTIATE_FOO_TEMPLATE_CLASS(MyClass) 扩展到另一个包含,如 in #include "MyClass.h"#include "FooTemplate.h"模板类 FooTemplate;
..
#pragma和_Pragma()在C语言中有什么区别? 语法: #pragma arg 和 _Pragma(arg) 什么时候应该使用 _Pragma(arg)? 解决方案 _Pragma 运算符在 C99 中引入._Pragma(arg) 是一个运算符,很像 sizeof 或 defined,可以嵌入到宏中. 根据 cpp.gnu.org 参考: 它的语法是_
..
宏参数中不允许使用逗号,因为它将被视为多个参数,并且预处理将是错误的.但是,我们可以将参数括起来,让预处理器将其视为一个参数.是否有可以删除括号的宏或其他技术? 例如,如果我定义一个宏 #define MY_MACRO(a, b) ... 并像使用它 MY_MACRO(A, text); 会错的.像这样使用它 MY_MACRO((A), text) 使用宏或技术来删除括号就可以了
..
我经常在 C 代码中使用类似对象的预处理器宏作为布尔标志来打开和关闭代码部分. 例如 #define DEBUG_PRINT 1 然后像这样使用它 #if(DEBUG_PRINT == 1)printf("%s", "测试");#万一 但是,如果忘记将包含 #define 的头文件包含在源代码中,则会出现问题.由于未声明宏,预处理器将其视为等于 0,并且 #if 语句永远不会运行.
..
是否可以在编译时或运行时确定传入宏或函数的参数是否为字符串文字? 例如, #define is_string_literal(X)......is_string_literal("你好") == true;const char * p = "你好";is_string_literal(p) == false; 或 bool is_string_literal(const char *
..
C 中的宏和函数有什么区别?请告诉我一个可以使用宏和函数的应用程序? 解决方案 基本的区别是编译函数和预处理宏.当您使用函数调用时,它将被转换为 ASM CALL,其中包含所有这些堆栈操作以传递参数和返回值.当您使用宏时,C 预处理器将使用宏翻译所有字符串,然后编译. 使用宏的缺点是它们隐藏了实现.如果有 bug 就更难找到了.
..
为什么 M(0) 和 N(0) 的结果不同? #define CAT_I(a, b) a ## b#define CAT(a, b) CAT_I(a, b)#define M_0 猫(x,y)#define M_1 不管什么_else#define M(a) CAT(M_, a)米(0);//展开为 CAT(x, y)#define N_0() CAT(x, y)#define N_1() 不管
..
我有一个用 C++ 编写的应用程序的源代码,我只想用以下方式评论一些东西: #ifdef 0...#万一 我得到了这个错误 错误:宏名必须是标识符 为什么会这样? 解决方案 #ifdef 指令用于检查是否定义了预处理器符号. 标准(C11 6.4.2 Identifiers) 规定标识符不得以数字开头: 标识符:非数字标识符标识符标识符非数字识别码标识符非数字:非数字通用
..
我正在尝试检测用于编译我的源代码的编译器.我可以轻松找到预定义的宏来检查 MSVC 或 GCC(请参阅 http://predef.sourceforge.net/例如),但我找不到任何宏来检查铿锵声. 有人知道 clang 是否定义了像 __CLANG__ 这样的宏来了解当前正在编译我的代码的内容吗? 解决方案 使用 strings + grep 找到答案: $ 字符串/usr/
..
我正在研究一个递归宏.但是,它似乎没有递归扩展.这是一个最小的工作示例来说明我的意思: //忽略输入,什么也不做#define 忽略(...)//根据数量在 6 个名称之间进行选择#define 选择(_1,_2,_3,_4,_5,_6,NAME,...) 名称//如果给这个宏提供了多个参数,则执行 f,否则忽略#define ifMore(f,...) 选择(__VA_ARGS__,f,f,f
..
测试预处理器符号是否定义的常用方法是使用#ifdef.但是,#ifdef 不能在宏中使用.如果该宏的参数是已定义的预处理器符号,我需要一种方法来检查该宏. 例如: #define TRACE(x,y) if(IS_DEFINED(x)){ std::cout
..
我想将一个字符串化的宏参数附加到可变参数宏中的每个元素.我想我知道我需要什么,但我还没有想出一个可行的解决方案.给定一个可变参数宏,例如: #define FIELD_DECLARATION(NAME, OTHER_FIELD, ...)FIELD_DECLARATION(第一,事物)FIELD_DECLARATION(第二,事物,事物,无) 我想生成: field_First = {Thi
..
我有很多生成函数的情况,并希望将它们指向我创建的一些通用函数(以允许我在生成的函数名称更改时重用基本代码). 基本上,我有一个函数名称列表如下: void Callback_SignalName1(void);无效回调信号名称2(无效);...等等 一旦生成这些,我想定义一个宏以允许它们被通用调用.我的想法是这样,但我没有任何运气来实现它......因为 C 预处理器采用宏的名称而不是宏
..
我试图弄清楚如何使用 GCC 为 #include 语句构建变量字符串. 我的想法是,对于我编写的每个源模块,我都希望将在构建过程早期创建的动态生成的 C 源作为标头包含在内. 生成此文件不是问题.不幸的是,包括它. 到目前为止我所拥有的是(identities.h): //identities.h# 定义 PASTER2(str) #str#define PASTER(str
..
我的代码有两种模式,debug 和 verbose.我在头文件中将它们定义为, #define verbose TRUE#define 调试 TRUE 到目前为止,在我的代码中,我一直在使用 #if(调试)//代码#万一 但是使用起来更合适吗? #ifdef 调试//代码#万一 我读过一些关于预处理器宏的文章,但当时并没有什么意义.所以,我有一个问题:#if defined MACRO
..
我经常看到 __WIN32、WIN32 或 __WIN32__.我认为这取决于使用的预处理器(来自 Visual Studio 或 gcc 等). 我现在必须先检查 os,然后再检查使用的编译器吗?我们在这里使用 G++ 4.4.x、Visual Studio 2008 和 Xcode(我假设它又是一个 gcc)和 ATM,我们只使用 __WIN32__、__APPLE__ 和 __LINU
..
来自 http://c-faq.com/style/strcmp.html,我学习了以下便利宏: #define Streq(s1, s2) (strcmp((s1), (s2)) == 0) 我想知道为什么在这个宏中使用了这么多括号.每个括号是有目的的,还是这个宏使用了没有目的的多余括号? 我们可以去掉 s1 和 s2 周围的括号,然后做一个这样的宏吗? #define MyStre
..