我一直想知道编译器如何看到指向结构的指针(在C中假设)和结构本身的真正区别.
struct person p;
struct person *pp;
Run Code Online (Sandbox Code Playgroud)
pp->age,我总是想象编译器会这样做:"pp的值+结构中的属性"age"的偏移量".
但它的作用是person.p什么?它几乎是一样的.对我来说,"程序员",p不是内存地址,它就像"结构本身",但当然这不是编译器如何处理它.
我的猜测是它更像是一种语法,而编译器总是如此(&p)->age.
我是对的?
我的Makefile是:
OBJS = b.o c.o a.o
FLAGS = -Wall -Werror
CC = gcc
test: $(OBJS)
$(CC) $(FLAGS) $(OBJS) -o test
b.o: b.c b.h
$(CC) $(FLAGS) -c b.c
a.o: a.c b.h c.h
$(CC) $(FLAGS) -c a.c
c.o: c.c c.h
$(CC) $(FLAGS) -c c.c
clean:
rm a
rm *.o
all: test
Run Code Online (Sandbox Code Playgroud)
如果我make再这样做make,它总是重建'测试'.为什么这样做?
即使我这样做:make a.o它重建...如果有帮助的话我会在Linux上.
在Windows中,如果我通过'test.exe'更改'test','-o test''更改'-o test',它可以正常工作.所以我想由于某些原因,我的linux中的'make'无法检查目录中我的文件的日期戳.
我修好了它!.c是在Windows中创建的.我在vi中打开了所有的.c和.h,没有做任何事情保存更改,一切正常.我认为日期戳是固定的.
假设我有一个A类和一个B类.
A的.h需要B的.h,B的.h需要A.的A.h(需要= #include).
所有.h都有警卫:
#ifndef _classX_
#define _classX_
...
...
#endif
Run Code Online (Sandbox Code Playgroud)
但是如果我编译A的.cpp,那么当它包含B的.h时,B类不能包含A类的.h,因为A类已经使用了守护.
我怎么解决这个问题?