你有什么方法可以做......
#define { { printf("%s,%s",_FUNCTION_, _LINE_); {
这不会编译。但我想知道是否有某种技巧可以有效地获得相同的功能? (除了在预处理步骤中编写工具以挂钩)
这样做的目的是思考如何获得糟糕的勒芒代码覆盖率。
答案 0 :(得分:7)
使用宏肯定不可能。宏的名称必须是标识符。大括号字符是标点符号,而不是标识符。
答案 1 :(得分:1)
我已经通过#define BEGIN ...
和#define END ...
看到了这一点(并非我支持它)。
e.g。
void foo(void)
BEGIN
stuff();
END
答案 2 :(得分:1)
答案 3 :(得分:0)
你无法改变编译器解释{}的方式。假设它们能够以语法方式确定代码是否正确以及它应该做什么。
如果您确实想做类似的事情,我建议在“{”“{MY_MACRO;”
上进行搜索和替换。答案 4 :(得分:0)
不带标准宏,不可以。 C标准(C11)对6.10.3 Macro replacement
中的宏有特定要求:
# define identifier replacement-list new-line
identifier
在6.4.2.1 Identifiers, General
中明确定义为:
identifier:
identifier-nondigit
identifier identifier-nondigit
identifier digit
identifier-nondigit:
nondigit
universal-character-name
other implementation-defined characters
nondigit: one of
_ a b c d e f g h i j k l m
n o p q r s t u v w x y z
A B C D E F G H I J K L M
N O P Q R S T U V W X Y Z
digit: one of
0 1 2 3 4 5 6 7 8 9
因此,唯一的*可能的漏洞将是other implementation-defined characters
,但这不是标准所涵盖的范围,因此不是真正可移植的。
在任何情况下,它都无法与类似以下代码一起很好地工作:
typedef struct {
int field1;
int field2;
} tMyStruct;
因为它会很烦人地在不应该存在任何语句的地方放置C语句:-)
我认为,如果您确实要执行此操作,则将使用更智能的预处理器(可以告诉代码应在何处以及何处不去处)对文件进行预处理,或修改代码明确地将宏放在应该放置的宏中,例如通过以下方式选择行为:
#ifdef PING_DEBUGGING
#define MYPING printf("%s,%s", _FUNCTION_, _LINE_)
#else
#define MY_PING
#endif
并将其用于:
void myFunc(void) { MYPING;
// proper body of function.
}