2011-07-24 36 views
4

有没有办法让C源文件打印到屏幕上,而不包括<stdio.h>C - 打印到屏幕没有#包括<stdio.h>?

这里是我的情况:我被要求编程手柄1000个C源文件将分别在C实现了几个数字功能(这些功能都应该对数据的工作,是在内存中,eithout任我/ O)。这些源文件的来源不清楚,因此,我想确保当我编译&运行这些源文件时,我的机器不会受到任何伤害。

有没有办法找出C源文件是否有潜在危害?我想要开发人员避免任何#include声明,但我确实需要printf - 因为我希望他们在main()以内包含他们的计算输出。

任何想法?

+1

你能再详细一点吗? – hari

+4

你为什么要那样做? – Felix

+0

那么,如果你觉得使用预处理器总是会出现'#error' ...你为什么要避免使用''? –

回答

3

当然,添加原型printf在你的源文件的顶部,只要你链接到CRT库,你可以使用该功能,而不包括stdio.h

printf原型

int printf (const char * format, ...); 
+0

是的,这是答案... – user3262424

1

虽然它们可能比SO格式的范围稍大一些。本质上,您可以在C中使用汇编调用。博客KSplice涉及该主题(使用代码和示例)here

0

当然,把必要的函数原型放入你的程序中。

如果你的意思是不使用printf,那么你有几个选择 - 你可以使用fwrite,或者你可以省掉流并使用write,或者你可以直接调用操作系统I/O服务,或者你可以说直接显示硬件或许多其他事物。

如果你想有一个更好的答案,或许可以解释为什么你想不包含了stdio.h

1

我想澄清一下为什么我们需要printf和studio.h到可能使概念更加清晰。 C是一种便携式语言。您可以编译用于Linux,Mac OSX,Windows的c。在每一种情况下,导致输出通常归结为系统调用,或在嵌入式系统中直接处理帧缓冲区或Uart设备。

所以当然这是可能的,你想这样做吗?取决于原因。如果您针对特定平台进行编码并且没有printf(),那么您可能必须考虑直接为该平台调用系统调用/编写一些特定于平台的汇编代码。这完全取决于你的用例。

0

这是愚蠢的,但仍:

#include <string.h> 

int main() { 
    puts ("hi"); 
return 0; 
} 

和输出:

$ gcc -o try try.c 
$ ./try 
hi 
+2

'puts()'实际上在''而不是''中定义。 – duskwuff

+0

谢谢你让我知道。无论如何,在OP描述了这个问题后,我的回答没有任何意义:D – hari

3

有没有办法找出如果C源文件可能是有害的?

不,没有。通过定义自己的原型或使用内联汇编,恶意的源文件可能可以做任何想要的事情 - #include只是编译时的便利。

+0

duskwuff,我可以检查源'c'文件中是否存在'asm' - 如果存在,则表示使用内联汇编;我错过了什么? – user3262424

+0

C中有大量的其他间接方法来做颠覆性的事情。把程序集放入字节缓冲区,将它转换为函数指针并调用它; '对dlsym()';有意造成缓冲区溢出;隐藏任何这些背后的预处理技巧...总而言之,没有办法来验证一些源代码是不是隐藏了一些东西。 – duskwuff

+0

黄昏,谢谢。你能给我至少*一些关键字*来帮助我说95%安全吗?例如'asm','dlsym','#' - 当它不遵循'include'等时,我只想** ** **更安全,即使不是100%。 – user3262424