gpt4 book ai didi

c++ - 苹果cpp中断宏参数粘贴

转载 作者:行者123 更新时间:2023-12-02 09:52:41 25 4
gpt4 key购买 nike

编译以下test.cpp

# define TopLevelProject X11

#define Concat3(a,b,c) a/**/b/**/c

# define ProjectRulesFile Concat3(<,TopLevelProject,.rules>)

#include ProjectRulesFile
cpp -I。 test.cpp
预期的行为是将生成一个include语句
# 1 "test.cpp"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "test.cpp"
# 10 "test.cpp"
# 1 "./X11.rules" 1
# 11 "test.cpp" 2



# 1 "./X11.rules" 1
# 15 "test.cpp" 2
注意行
“./X11.rules”
确实是输出
然而,苹果的clang cpp提供输出
# 1 "test.cpp"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 361 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "test.cpp" 2


test.cpp:7:10: fatal error: ' X11 .rules' file not found
#include ProjectRulesFile
^~~~~~~~~~~~~~~~
test.cpp:5:35: note: expanded from macro 'ProjectRulesFile'
# define ProjectRulesFile Concat3(<,TopLevelProject,.rules>)
~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
test.cpp:3:24: note: expanded from macro 'Concat3'
#define Concat3(a,b,c) a/**/b/**/c
^~~~~~~~~~~

1 error generated.
请注意格式错误的文件名 'X11 .rules'
Apple的cpp在Concat3宏的第一个参数之前插入了一个空格,在第二个参数和第三个参数之间插入了一个空格。
gcc,clang和msdev工具的所有版本均执行正确的文本替换。

苹果的cpp的所有版本(例如xcode分发的版本)都存在此错误。
我可以使用某种宏参数串联方案来编写 Concat3 宏,以便它在苹果的cpp下工作吗?
谢谢

最佳答案

Concat3(a,b,c) a/**/b/**/c是一种古老的,预先规范的,不推荐使用的,长时间不使用的级联方法。它通常不适用于任何现代机器(即1990年前后)。它可能特别适用于将 header 名称与某些编译器连接在一起,因为这是实现定义的区域。

6.10.2/4 The method by which a sequence of preprocessing tokens between a < and a > preprocessing token pair or a pair of " characters is combined into a single header name preprocessing token is implementation-defined.


用此方法连接不是标题名称的任何内容都是不可能的。
没有标准的方法来连接适用于所有编译器的 header 名称。标准把戏
#define CAT(a,b) CAT2(a,b)
#define CAT2(a,b) a ## b
如果结果不是有效的预处理 token (大多数报头名称不是),则不起作用。

关于c++ - 苹果cpp中断宏参数粘贴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63207875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com