如何添加静态断言以检查变量是否为静态?

如何解决如何添加静态断言以检查变量是否为静态?

| 我有一个仅对静态局部变量有效的宏(因为它使用内联汇编符号来提取有关该变量的数据)。我需要一种方法来强制宏的输入确实是静态局部变量: 正确:
func f()
{
    static int x;
    my_macro(x);
}
不正确:
func f()
{
    int x;
    my_macro(x);
}
我使用GCC for C(没有C ++)。     

解决方法

您可以使用以下技巧:
#define ASSERT_LOCAL_STATIC(v) static void *p_ ## v = &v

void fn()
{
    int nonstatic_var = 0;
    static int static_var = 0;

    ASSERT_LOCAL_STATIC(static_var);
    ASSERT_LOCAL_STATIC(nonstatic_var);
}
对于非静态变量,GCC发出错误“初始化元素不是常量”。     ,您可以通过使用它们的地址来区分静态变量和局部变量: 静态变量存储在.BSS或.DATA节中 局部变量存储在堆栈中 例如我系统上以下程序的输出
#include <stdio.h>

void f0() {
    int x = 0;
    printf(\"%p\\n\",&x);
}

void f1() {
    static int x = 0;
    printf(\"%p\\n\",&x);
}

int main() {
        f0();
        f1();

        return 0;
}
这是:
0x7fff1dc718dc
0x600900
每个部分和堆栈的放置位置取决于平台的ABI,但您可以使用块局部变量的地址来形成条件:
#include <stdio.h>

#define check(var) { \\
        int ___ = 0; \\
        printf(\"%s (%p): %s\\n\",#var,&var,(&var > &___)?\"local\":\"static\"); \\
}

void f0() {
    int x = 0;
    check(x);
}

void f1() {
    static int y = 0;
    check(y);
}

int main() {
        f0();
        f1();

        return 0;
}
输出:
x (0x7fff4b965afc): local
y (0x600978): static
警告:我不建议您使用此“技巧”。仅此而已:一个技巧,在最不适当的情况下会失败。只要正确地记录您的宏,然后让使用它的人员处理滥用它的后果即可。     ,只需按照大多数C库使用的方式进行操作即可:告诉用户您的宏适用于静态变量,而其他任何行为都可能是不确定的/意外的。 就像您还可以将NULL指针传递给
strdup()
等一样,这只会导致segfault而不导致任何不强制执行的问题。     ,我认为您无法在ISO C中区分这些情况。但是由于您已经提到使用GCC,因此可能会有一些有用的内置伪函数。它们的名称都以ѭ8开头,因此您应该阅读GCC文档中的列表。 http://www.google.com/search?q=gcc+builtin 好吧,我只是通读了整个内置部分,却没有找到任何东西。因此,我认为这实际上是不可能的。 出于好奇,您打算如何使用该宏?     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?