在C

时间:2018-05-18 21:30:56

标签: c

假设有这段代码:

#ifndef TEST_H_
#define TEST_H_

#define NAME "John Doe"

#endif

定义NAME用于其中一个.c文件

void print_name()
{
      printf("Name is: %s\n\n",NAME)
}

是否可以编译程序..然后将NAME的值更改为“Johnny”,当程序再次运行时...不编译它,它打印“Johnny”而不是“John Doe”??

我很想知道是否有可能。 感谢您提供任何帮助或建议..

6 个答案:

答案 0 :(得分:2)

不是琐碎的。包含的文件被粘贴到源中,源文件和头文件在技术上不再存在于二进制输出中。

然而,你可以编辑二进制文件,如果你做得正确(例如,不能用3个字符的替换替换10个字符的字符串,因为它错了对齐的东西),你可以得到它工作。

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

#include <stdio.h>
int main()
{
      printf("Name is: %s\n\n","John Doe");
}

编译,运行,编辑,重新运行:

$ gcc file.c 
$ ./a.out
  Name is: John Doe

$ sed -i 's/John Doe/Johnny\x00\x00/' a.out
$ ./a.out
  Name is: Johnny

答案 1 :(得分:1)

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

  • 十六进制编辑器&#34; direct&#34;修改可执行文件,在那里你可以查找字符串&#34; John Doe&#34;并将其替换为&#34; Johny&#34; (使用额外的空字节填充),如PSkocikMustacheMoses
  • 所述
  • 根据修改,我相当确定有更专业的工具来尝试它们。但我不知道它们是什么。
  • 您还可以将NAME变为extern变量而不是宏,其中extern char *NAME;位于头文件中,char *NAME = "John Doe";位于单独的.c文件中。然后,如果你想更改名称,你只需要在它定义的一个小文件中更改它,重新编译它,然后只需重新链接到程序的其余部分。这仍然涉及一些重新编译,但它比重新编译所有内容要快得多。

为了提出建议,我需要知道你的用例,但我提到的第三个选项比直接修改可执行文件更常见。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

如果不重新编译,宏就无法改变。它不是变量或者你可以操作的东西,所以让宏给出与编程不同的值是不可能的,但改变值并重新编译是不可能的。

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

由source.c

#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
$ -

答案 4 :(得分:0)

如果程序打开头文件,扫描以查找public function postchangepassword(Request $request){ $usertoken = $this->checktoken($request); // this here gets the token for authentication if ($usertoken) { $validator = Validator::make($request->all(), User::$password_rules); if ($validator->fails()){ $result['status']='fail'; $result['message']='Validation unseccessful'; return $result; } $user=$usertoken->user()->first(); // you are geting authenticated user by this if(Hash::check($request->get('password'), $user->password)){ $user->password=bcrypt($request->get('newpassword')); $update=$user->update(); if($update){ $result['status']='successful'; $result['message']='Password updated'; return $result; } $result['status']='fail'; $result['message']='Password could not be updated'; return $result; } $result['status']='fail'; $result['message']='Current password is wrong'; return $result; } $result['status']='fail'; $result['message']='Invalid token'; return $result; } 行,然后获取值。像一个非常简单的预处理器。如果添加#if或#ifdef条件,则最终值可能无效。

答案 5 :(得分:-1)

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

  char NAME[] = "John Doe";

你已经完成了