我正在尝试定义一个宏来生成一个包含变量的令牌名称.
基本上,我正在尝试的是:
#define GLUER(x,y,z) x##y##z
#define PxDIR(x) GLUER(P,x,DIR)
int main() {
int port;
port = 2;
PxDIR(port) |= 0x01;
}
Run Code Online (Sandbox Code Playgroud)
我希望在上面的语句中生成令牌P2DIR,但根据我的编译器输出,它生成令牌PportDIR,这不是我想要的.这里有什么帮助?或者我正在尝试做什么不可能?
是否可以对此C宏进行字符串化:
#define GPIO_INT_PIN (GPIO_PORT_D|GPIO_PIN_IRQ_RISING|GPIO_PIN5)
Run Code Online (Sandbox Code Playgroud)
使用类似的东西
MY_STRINGFY(GPIO_INT_PIN)
Run Code Online (Sandbox Code Playgroud)
要得到
"(GPIO_PORT_D|GPIO_PIN_IRQ_RISING|GPIO_PIN5)" ?
我正在进行一个项目,我有许多由连接(数字等)形成的常量字符串.
例如,我有一个LOCATION格式化的宏,__FILE__并且__LINE__在打印消息或错误时,我可以用它来知道我在代码中的位置:
#define _STR(x) # x
#define STR(x) _STR(x)
#define LOCATION __FILE__ "(" STR(__LINE__) ")"
Run Code Online (Sandbox Code Playgroud)
因此,这将格式化像"file.cpp(42)"的位置.问题是当我尝试将结果转换为宽字符串时:
#define _WIDEN(x) L ## x
#define WIDEN(x) _WIDEN(x)
#define WLOCATION WIDEN(LOCATION)
Run Code Online (Sandbox Code Playgroud)
这适用于GCC,并导致L"file.cpp(42)"插入到我的代码中.但是,当使用MSVC++(使用Visual C++ 2008 Express)尝试此操作时,我收到一个错误:
error: Concatenating wide "file.cpp" with narrow "("
Run Code Online (Sandbox Code Playgroud)
我知道L前缀只会添加到我的表达式的第一个术语中.我也试过这个:
#define _WIDEN(x) L ## #x
Run Code Online (Sandbox Code Playgroud)
哪个"有用",但是给出了L"\"file.cpp\" \"(\" \"42\" \")\""显然不太方便的字符串(而不是我想要的),特别是考虑到这个宏与其他宏相比很简单.
所以,我的问题是:如何才能将它应用于MSVC++中的整个表达式,这样我可以得到与GCC相同的结果?我宁愿不用全宽标记创建第二个字符串,因为我必须为每个标记维护两个宏,这不是很方便并且可能导致错误.另外,我也需要每个字符串的窄版本,所以不幸的是,使用全宽字符串也不是一种选择.
我想用预处理器评论一行:
#define open /##*
#define close */
main()
{
open commented line close
}
Run Code Online (Sandbox Code Playgroud)
当我做$gcc -E filename.c我想到的
/* commented line */
Run Code Online (Sandbox Code Playgroud)
但我明白了
/ * commented line */
Run Code Online (Sandbox Code Playgroud)
这样编译器就会显示错误
为什么会给出不必要的空间?
我们使用jstree作为导航菜单编辑器,并且已经将元数据分配给树的节点,如下所示:
var data = currentNode.data("jstree");
data.title = textBoxTitle.val();
data.linkType = textBoxLink.val();
Run Code Online (Sandbox Code Playgroud)
我可以看到该data对象包含相关属性,但不太确定jquery在此点之后保留关联数据的位置.
当我们来保存数据(将其序列化为我们的服务器端语言)时,元数据似乎被忽略了......
var json = jQuery.jstree._reference(tree).get_json();
var jsonString = JSON.stringify(json);
Run Code Online (Sandbox Code Playgroud)
的json对象进行检查,以不具有属性描述该元数据.
我们如何序列化对象及其元数据?
提前致谢,
我想知道这段代码输出背后的原因.我无法想出答案.
#define f(a,b) a##b
#define g(a) #a
#define h(a) g(a)
void main()
{
printf("%s %s",h(f(1,2)),g(f(1,2)));
}
Run Code Online (Sandbox Code Playgroud)
PS:输出是12 f(1,2).我以为是12 12或f(1,2) f(1,2).
该Ç和C++标准都包括文本,如果stringize操作未能出示有效的字符串文字令牌,该行为是不确定的影响.在C++ 11中,这实际上是可行的,方法是在原始字符串文字中包含换行符.但是,标准中始终存在着这一切.
有没有其他方式stringize可以产生UB,其中UB或一个不正确的程序尚未发生?
我很想知道任何C或C++的方言.我正在写一个预处理器.
如何使用 GNU gfortran 对预处理器宏进行字符串化?我想将宏定义传递给 GNU gfortran,然后将其用作代码中的字符串。
实际上,我想这样做:
program test
implicit none
character (len=:), allocatable :: astring
astring = MYMACRO
write (*, *) astring
end program test
Run Code Online (Sandbox Code Playgroud)
然后构建:
gfortran -DMYMACRO=hello test.F90
Run Code Online (Sandbox Code Playgroud)
我尝试创建各种宏,例如:
#define STRINGIFY_(x) #x
#define STRINGIFY(x) STRINGIFY_(x)
...
astring = STRINGIFY(MYMACRO)
Run Code Online (Sandbox Code Playgroud)
但这不适用于 gfortran 预处理器。
我还尝试使用不同风格的宏:
#define STRINGIFY(x) "x"
...
astring = STRINGIFY(MYMACRO)
Run Code Online (Sandbox Code Playgroud)
但这只会创建一个包含文本“MYMACRO”的字符串。
然后我尝试将宏定义更改为:
-DMYMACRO=\"hello\"
Run Code Online (Sandbox Code Playgroud)
但这在构建过程中导致了无关的问题。
感谢您的帮助
我有一些相当通用的代码,它使用预处理器宏将某个前缀添加到其他宏上.这是一个简单的例子:
#define MY_VAR(x) prefix_##x
Run Code Online (Sandbox Code Playgroud)
"prefix_"实际上是在别处定义的,因此每次包含文件时它都会有所不同.它运行良好,但现在我有一些代码我想跳过如果其中一个令牌不存在,但这不起作用:
#if defined MY_VAR(hello)
Run Code Online (Sandbox Code Playgroud)
我希望它扩展到的是:
#ifdef prefix_hello
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何.我需要使用MY_VAR()宏来进行扩展,所以我不能只是对名称进行硬编码.(实际上对于一些测试代码,每次测试一堆类时,相同的代码都包含不同的前缀,我想跳过几个类的几个测试.)
这可能与C++预处理器有关吗?
更新:
这里有一些半可编译的代码可以进一步说明问题:(避免将其压缩到下面的注释中)
#define PREFIX hello
#define DO_COMBINE(p, x) p ## _ ## x
#define COMBINE(p, x) DO_COMBINE(p, x)
#define MY_VAR(x) COMBINE(PREFIX, x)
// MY_VAR(test) should evaluate to hello_test
#define hello_test "blah blah"
// This doesn't work
#ifdef MY_VAR(test)
printf("%s\n", MY_VAR(test));
#endif
Run Code Online (Sandbox Code Playgroud) #define PATH "yagh/headers/"
#define FILNAME "includefile"
#define CONCAT(a__, b__) CONCAT_DO(a__, b__)
#define CONCAT_DO(a__, b__) a__##b__
#define CONCATTHREE(a__, b__, c__) CONCAT(CONCAT(a__, b__), c__)
#define STRINGIFY(a__) #a__
#include STRINGIFY(CONCATTHREE(PATH ,FILNAME ,.h));
Run Code Online (Sandbox Code Playgroud)
这个宏在VS编译器中工作正常,但不能在GCC编译器上编译:
错误:错误:粘贴"/"和"includefile"不提供有效的预处理令牌
对于某些包含文件,它会给出错误:
错误:粘贴"includefile"和"." 不提供有效的预处理令牌