【发布时间】:2014-12-03 03:53:47
【问题描述】:
几个 GCC 版本之前,我可以做这样的整洁的事情:
$ objcopy -I binary -O elf64-x86-64 -B i386 foo.png foo.png.o
...在C中加上以下,作为SDL图像加载的例子:
extern void _binary_foo_png_start;
extern void _binary_foo_png_start;
SDL_Surface *image = IMG_Load_RW(SDL_RWFromMem(&_binary_foo_png_start, &_binary_foo_png_end));
然后我将foo.png.o与C文件中的目标文件链接在一起,得到一个包含foo.png的可执行文件。
这些天,我仍然可以这样做,但 GCC 警告我:
foo.c:57:19: warning: taking address of expression of type ‘void’
foo.c:57:44: warning: taking address of expression of type ‘void’
显然它仍然有效,据我所知,它确实做到了它应该做的事情。符号本身没有明确定义的类型,因此将它们声明为void 似乎很合适。我的意思是,当然,我可以给他们任何其他任意类型,它仍然可以像我想要他们的地址一样工作,但声明他们void似乎比只是编造一些类型。
那么为什么 GCC 突然决定开始警告我呢?是否有其他首选方式可以做到这一点?
【问题讨论】:
-
也许,但是让我的输出冲击充满这些会压制有意义的警告。 :)
-
当然,更不用说它表明 GCC 建议不要这样做,我想知道为什么会建议这样做。
-
这是大自然告诉您避免使用非标准 GCC 结构的方式。你想要一些字节的地址,所以给它们
char类型并不完全是任意的。 -
如果您只对实际编程感兴趣,请将您的符号声明为
char[],这是有效、直观且无警告的,然后继续。如果你想知道你违反了标准的哪些部分,这里是另一个:“每个声明符声明一个标识符,并断言当一个与声明符形式相同的操作数出现在表达式中时,它指定一个函数或对象声明说明符指示的范围、存储期限和类型”。没有 void 类型的对象,所以你不应该声明一个。 -
不能用
extern char[] _binary_foo_png等吗?