是否有可能在C中重新定义{和}?

时间:2010-07-22 00:06:09

标签: c

你有什么方法可以做......

#define {  { printf("%s,%s",_FUNCTION_, _LINE_); { 

这不会编译。但我想知道是否有某种技巧可以有效地获得相同的功能? (除了在预处理步骤中编写工具以挂钩)

这样做的目的是思考如何获得糟糕的勒芒代码覆盖率。

5 个答案:

答案 0 :(得分:7)

使用宏肯定不可能。宏的名称必须是标识符。大括号字符是标点符号,而不是标识符。

答案 1 :(得分:1)

我已经通过#define BEGIN ...#define END ...看到了这一点(并非我支持它)。

e.g。

void foo(void)
BEGIN
    stuff();
END

答案 2 :(得分:1)

使用these questions中讨论的工具获取富人的代码覆盖率,尤其是gcov,这是GCC的一部分。

答案 3 :(得分:0)

你无法改变编译器解释{}的方式。假设它们能够以语法方式确定代码是否正确以及它应该做什么。

如果您确实想做类似的事情,我建议在“{”“{MY_MACRO;”

上进行搜索和替换。

答案 4 :(得分:0)

不带标准宏,不可以。 C标准(C11)对6.10.3 Macro replacement中的宏有特定要求:

# define identifier replacement-list new-line

identifier6.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.
}