标签: stringification

C宏令牌连接涉及变量 - 是否可能?

我正在尝试定义一个宏来生成一个包含变量的令牌名称.

基本上,我正在尝试的是:

#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 concatenation token stringification c-preprocessor

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

字符串化第一级宏扩展C.

是否可以对此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)"

c macros stringification c-preprocessor

8
推荐指数
1
解决办法
438
查看次数

如何使用C预处理器将连接字符串转换为wide-char?

我正在进行一个项目,我有许多由连接(数字等)形成的常量字符串.

例如,我有一个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相同的结果?我宁愿不用全宽标记创建第二个字符串,因为我必须为每个标记维护两个宏,这不是很方便并且可能导致错误.另外,我也需要每个字符串的窄版本,所以不幸的是,使用全宽字符串也不是一种选择.

c++ wchar-t stringification visual-c++ c-preprocessor

7
推荐指数
1
解决办法
5348
查看次数

为什么预处理器会占用空间?

我想用预处理器评论一行:

#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)

这样编译器就会显示错误

为什么会给出不必要的空间?

stringification c-preprocessor

7
推荐指数
3
解决办法
213
查看次数

获取JSTree的JSON数据及其元数据

我们使用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对象进行检查,以不具有属性描述该元数据.

我们如何序列化对象及其元数据?

提前致谢,

  • 格雷格.

jquery json metadata stringification jstree

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

C预处理器:stringize宏和身份宏

我想知道这段代码输出背后的原因.我无法想出答案.

#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 12f(1,2) f(1,2).

c macros stringification c-preprocessor

7
推荐指数
1
解决办法
2072
查看次数

Stringize运算符失败

Ç和C++标准都包括文本,如果stringize操作未能出示有效的字符串文字令牌,该行为是不确定的影响.在C++ 11中,这实际上是可行的,方法是在原始字符串文字中包含换行符.但是,标准中始终存在着这一切.

有没有其他方式stringize可以产生UB,其中UB或一个不正确的程序尚未发生?

我很想知道任何C或C++的方言.我正在一个预处理器.

c c++ stringification c-preprocessor

7
推荐指数
1
解决办法
589
查看次数

使用 GNU gfortran 将宏字符串化

如何使用 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)

但这在构建过程中导致了无关的问题。

感谢您的帮助

preprocessor fortran gfortran stringification stringify

7
推荐指数
1
解决办法
1583
查看次数

你如何在#ifdef中执行宏扩展?

我有一些相当通用的代码,它使用预处理器宏将某个前缀添加到其他宏上.这是一个简单的例子:

#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)

c++ macros stringification c-preprocessor

6
推荐指数
1
解决办法
2573
查看次数

预处理器宏GCC:粘贴x和x不会提供有效的预处理令牌

#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"和"." 不提供有效的预处理令牌

c gcc string-concatenation stringification c-preprocessor

6
推荐指数
1
解决办法
8068
查看次数