Write-Only pointer type

前端 未结 6 854
执念已碎
执念已碎 2021-01-30 16:14

I\'m writing software for an embedded system.

We are using pointers to access registers of an FPGA device.
Some of the registers are read-only, while others are wr

6条回答
  •  臣服心动
    2021-01-30 16:48

    I see no elegant way of doing it in C. I do however see a way of doing it:

    #define DEREF_PTR(type, ptr) type ptr; \
    typedef char ptr ## _DEREF_PTR;
    
    #define NO_DEREF_PTR(type, ptr) type ptr; \
    
    #define DEREFERENCE(ptr) \
    *ptr; \
    {ptr ## _DEREF_PTR \
    attempt_to_dereference_pointer_ ## ptr;}
    
    int main(int argc, char *argv[]) {
        DEREF_PTR(int*, x)
        NO_DEREF_PTR(int*, y);
    
        DEREFERENCE(x);
        DEREFERENCE(y); // will throw an error
    }
    

    This has the benefit of giving you static error checking. Of course, using this method, you'll have to go out and modify all of your pointer declarations to use macros, which is probably not a whole lot of fun.

    Edit: As described in the comments.

    #define READABLE_PTR(type, ptr) type ptr; \
    typedef char ptr ## _READABLE_PTR;
    
    #define NON_READABLE_PTR(type, ptr) type ptr; \
    
    #define GET(ptr) \
    *ptr; \
    {ptr ## _READABLE_PTR \
    attempt_to_dereference_non_readable_pointer_ ## ptr;}
    
    #define SET(ptr, value) \
    *ptr = value;
    
    
    int main(int argc, char *argv[]) {
        READABLE_PTR(int*, x)
        NON_READABLE_PTR(int*, y);
    
        SET(x, 1);
        SET(y, 1);
    
        int foo = GET(x);
        int bar = GET(y); // error
    }
    

提交回复
热议问题