Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中显示头文件的更改定义_C - Fatal编程技术网

在C中显示头文件的更改定义

在C中显示头文件的更改定义,c,C,假设有以下代码: #ifndef TEST_H_ #define TEST_H_ #define NAME "John Doe" #endif 定义名称在一个.c文件中使用 void print_name() { printf("Name is: %s\n\n",NAME) } 有可能编译这个程序吗。。然后将NAME的值更改为“Johnny”,当程序再次运行时。。没有编译它,它会打印“Johnny”而不是“John Doe” 我只是想知道这是否可能。 感谢您的帮助或建议。是的

假设有以下代码:

#ifndef TEST_H_
#define TEST_H_

#define NAME "John Doe"

#endif
定义名称在一个.c文件中使用

void print_name()
{
      printf("Name is: %s\n\n",NAME)
}
有可能编译这个程序吗。。然后将NAME的值更改为“Johnny”,当程序再次运行时。。没有编译它,它会打印“Johnny”而不是“John Doe”

我只是想知道这是否可能。
感谢您的帮助或建议。

是的,您可以使用称为十六进制编辑器的工具来更改生成的可执行文件中存储字符串的内容。

非常简单。包含的文件被粘贴到源文件中,从技术上讲,二进制输出中不再存在源文件或头文件

但是,您可以编辑二进制文件,如果您操作正确(例如,不能将10个字符的字符串替换为3个字符的替换,因为这会使内容不对齐),您可以让它工作

示例:(您的示例简化):


不是。定义是预处理器的一部分,不是C变量和符号。在预处理过程中,定义以文本形式替换为其值 如果在程序执行期间需要更改某些内容,则需要C变量

  char NAME[] = "John Doe";

您已经完成了

,这取决于您不重新编译的意思。您需要以某种方式更改程序文件,但可以通过多种方式进行更改:

  • 十六进制编辑器是对可执行文件的其他“直接”修改,您可以在其中查找字符串“John Doe”并将其替换为“Johny”(带有额外的空字节填充),如和所述
  • 根据修改情况,我相当肯定有更多的专用工具来尝试它们。但我不知道它们是什么
  • 您还可以使用
    extern char*NAME将
    NAME
    设置为
    extern
    变量,而不是宏
    char*NAME=“John Doe”在单独的.c文件中。然后,如果您想更改名称,您只需要在定义它的一个小文件中更改它,重新编译它,然后与程序的其余部分重新链接。这仍然需要重新编译,但比重新编译所有内容快得多

要提出建议,我需要了解您的用例,但我提到的第三个选项比直接修改可执行文件要常见得多。

宏是不重新编译就无法更改的东西。它不是一个变量,也不是可以操作的东西,所以不可能让一个宏给出一个与编程不同的值,而是改变值并重新编译

您可以根据另一个宏的值(编译时可以在命令行上传递给编译器的值)为宏指定不同的定义,但无论如何,您需要重新编译源代码。这允许您调整文件而不必编辑它,但决不会避免您重新编译它

资料来源c 或


如果程序打开头文件,扫描以查找
#define NAME
行,然后获取值,则是可能的。类似于非常简单的预处理器。如果您添加了#if或#ifdef条件,则最终值可能无效。

不是真的,不是。如果您希望能够在不重新编译的情况下更改某些内容,则需要能够读入程序的内容,例如命令行参数或配置文件。如果需要更改,为什么要在程序中对其进行硬编码?另一个选项是在代码外部使用一个持久数据文件,其中包含要循环使用的计数和名称列表,并在每次运行代码时更新计数。在便携式计算机中无法执行此操作态度。尽管如此,对于某些实现可能还是有解决方案的。如果“新”字符串大于“旧”字符串,则在任何情况下都很可能遇到问题。@JaimeT不太-“智能”nnon十六进制编辑器。可能是像我的asnwer:)中那样的流编辑器(sed)。他可以添加空字节的填充though@Malina确切地说;)非常糟糕的解决方案,因为可执行文件通常受到CRC(或there方法)的保护,从而使病毒的开发变得更加困难。在做一些不该做的事情时,不会有任何“好”的解决方案……我并不是说这是一个“好”的解决方案。只是,如果你想进行一些黑客攻击(而且可执行文件没有哈希保护),你可以“让它工作起来”。:)我在哪里需要char NAME[]=“John Doe”;我不会回答,因为这是一个太基本的问题。请从C书开始学习基础知识
$ gcc file.c 
$ ./a.out
  Name is: John Doe

$ sed -i 's/John Doe/Johnny\x00\x00/' a.out
$ ./a.out
  Name is: Johnny
  char NAME[] = "John Doe";
#include <stdio.h>

#ifndef VERSION
#define VERSION 0
#endif /* VERSION */

#if VERSION
#define NAME "John Doe"
#else
#define NAME "Johnny Guitar"
#endif

int main()
{
    puts("the winner is " NAME);
} /* main */
$ cc source.c
$ a.out
the winner is Johnny Guitar
$ _
$ cc -DVERSION=1 source.c
$ a.out
the winner is John Doe
$ -