1

我正在寻找一种创造性的解决方案,以确保使用 TMS470 编译器在 C 语言中使用 volatile 类型声明传递给特定宏的变量。意义:

好方法:

volatile int   *_p_reg;
VOLATILE_MACRO(_p_reg);

编译失败:

int   *_p_reg;
VOLATILE_MACRO(_p_reg);

我希望在编译后执行验证,这意味着检查反汇编或调试信息并识别这些调用。我似乎无法在调试信息中找到 volatile 的任何证据。

有任何想法吗?

谢谢!

4

2 回答 2

1

我不希望有任何,但当然这完全取决于编译器。

您当然可以重新构建它,以便宏完成整个定义,即

#define VOLATILE_MACRO(t, p) volatile t p

并像这样使用它:

VOLATILE_MACRO(int, _p_reg);

但当然,这可能不适合你。

于 2014-06-17T14:14:15.340 回答
0

使用 gcc 扩展的两种可能的解决方案。运行时版本使用__builtin_types_compatible_passert. 编译时版本类似,但使用 hack 来获取在编译时触发的静态断言(尽管带有相当神秘的错误消息):

运行

#include <stdio.h>
#include <assert.h>

#define VOLATILE_MACRO(p) \
    assert (__builtin_types_compatible_p(typeof(p), typeof(volatile int *)))

int main()
{
    volatile int * x;
    int * y;

    VOLATILE_MACRO(x);  // <<< OK
    VOLATILE_MACRO(y);  // <<< run-time error

    return 0;
}

编译时

#include <stdio.h>
#include <assert.h>

#define A                      BUILD_NAME(__LINE__)
#define BUILD_NAME(line)       BUILD_NAME2(line)
#define BUILD_NAME2(line)      assert_ ## line
#define STATIC_ASSERT(test)    typedef char A[(test) ? 1 : -1]

#define VOLATILE_MACRO(p) \
    STATIC_ASSERT (__builtin_types_compatible_p(typeof(p), typeof(volatile int *)))

int main()
{
    volatile int * x;
    int * y;

    VOLATILE_MACRO(x);  // <<< OK
    VOLATILE_MACRO(y);  // <<< compile error

    return 0;
}

请注意,如果您需要支持其他volatile类型,则可以使用多个链式测试简单地扩展宏__builtin_types_compatible_p,例如

#define VOLATILE_MACRO(p) \
    assert (__builtin_types_compatible_p(typeof(p), typeof(volatile int *)) ||
            __builtin_types_compatible_p(typeof(p), typeof(volatile short *)))
于 2014-06-17T15:22:42.860 回答