소스 내에서 모든 printf()함수를 제거하려고 합니다. 어떻게 해

lovejin0309의 이미지

7개의 C 소스 파일을 가지고 있습니다.

각 소스는 약 1만줄의 길이를 가지고 있습니다.

이 소스 안의 모든 printf()라인을 없애고 싶은데 어떻게 해야 할까요?

sed를 찾아 왔는데, 잘 모르겠네요.

mach의 이미지

만줄이면 쉬엄쉬엄 고쳐도 되겠군요.
소스 코드를 특정 툴로 막 고치는것은 별로 권장하고 싶지 않군요.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

sangwoo의 이미지

절대로 추천하지 않지만, '모든 소스' 라면..
printf를 #undef 해버리고, no-op으로 다시 define 하는게 가장
간단한 방법일 거 같습니다.

----
Let's shut up and code.

ironiris의 이미지

편집기에서 printf 문구를 notihng_printf 로 바꾸고
아무 코드도 들어있지 않는 nothing_printf 함수를 하나 만들어주면 되겠네요.
7번 작업하면 되겠네요. :)

kall의 이미지

perl -pi -e 's/*printf*//g' *.c 실험해보지 않아서 무슨일이 일어날지 모릅니다. :twisted: 백업하시고 실험해 보세요. :)

----
자신을 이길 수 있는자는
무슨짓이든 할수있다..
즉..무서운 넘이란 말이지 ^-_-^
나? 아직 멀었지 ㅠㅠ

lovejin0309의 이미지

디버깅용으로 삽입한 printf() 입니다.

삭제 해도 전혀 상관 없구요.

sed로 치환 하는 것은 할 수 있는데 라인 자체를 없애는 건 못해서 그럽니다.

도와 주세요.

aero의 이미지

grep -v printf from.c > to.c

이런식으로 해보세요.

여러 파일 한꺼번에 할려면 적절히 스크립트 짜시면 될듯하고

익명 사용자의 이미지

vim에서

q : record
/printf
dd
w :record를 담을 key(a-z)까지 아무거나.
100@w :100번 실행

정확한 건 찾아서 해보세요...
반드시 백업하시고요.

alsong의 이미지

위에글중 :뒤는 설명입니다.
:앞에것만 치세요.

그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.

tifler의 이미지

for i in `find ./ -name \*.c`; do sed 's/\<printf\>/PRINTF/g' $i > $i.edit; done

#ifdef DEBUG
#define PRINTF printf
#else
#define PRINTF(...) do {} while(0)
#endif /*DEBUG*/

/***********************
* while(1) sleep(INFINITE);
***********************/

pynoos의 이미지

vi 에서,

:g/printf/d

printf 줄은 다 지워지지요...

ymink의 이미지

ironiris wrote:
편집기에서 printf 문구를 notihng_printf 로 바꾸고
아무 코드도 들어있지 않는 nothing_printf 함수를 하나 만들어주면 되겠네요.
7번 작업하면 되겠네요. :)

원츄~ (편집기에서 nothing_printf로 바꾼다는 부분만 빼고)

lovejin0309님이 어떻게 coding하셨는 지 잘은 모르겠지만, printf를 두 줄 이상에 걸쳐서 사용했다면 단순한 pattern matching만으로는 매우 위험합니다.
printf(blahblah~);
라고만 하면 괜찮은데,

printf(blahblahblah...
blahblahblah...
blahblahblah);

라고 하신게 있다면.... 대략 난감 ㅡ.ㅡ;
익명 사용자의 이미지

Run emacs and try:

1. C-s printf
2. C-M-b
3. C-<space>
4. C-s (
5. C-b
6. C-M f
7. C-s ;
8. C-f
9. C-w

If that works,
0. C-x (
1 - 9
10. C-x )

Then C-u 1000000 C-x e (1000000 means quite big unknown number)

mirr의 이미지

grep printf\( *.c 라고 하신뒤
일일히 vi나 vim으로 열어서 찾아서 지우세요.
7개밖에 안넣었다면 7번만 고치면 되겠네요...
초심자의 무대포입니다.

내 마음속의 악마가 자꾸만 나를 부추겨.
늘 해왔던 것에 만족하지 말고 뭔가 불가능해 보이는 것을 하라고 말야.

IsExist의 이미지

그냥 preprocessing 기능을 이용하세요.

헤더 하나 만드시고

#include <stdarg.h>

#define printf(x, ...) 

각 소스파일에서 마지막 include 문 다음 저 헤더를 추가해 주세요.

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

cinsk의 이미지

#include <stdio.h>

한 다음에.
#define printf(....)          ((void)0)
alsong의 이미지

printf(blahblahblah... 
blahblahblah... 
blahblahblah);

일때

vim에서
qw
/printf
shift-v
/);
$
d
q

1000@w

위에 q하고 나중에 w가 아니고 qw하고 나중에 q를 붙어야 되네요
생각으로만 적다보니 약간 틀렸군요.

그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.

liberta의 이미지

"printf" 문자열만 찾을 게 아니라, "sprintf" "fprintf" 등을 피해야 하고 또한 "printf(" "printf (" 등의 경우도 고려해야겠지요. 단순히 문자열을 찾아서 자동으로 어떻게 하는 건 어쨌거나 비추천입니다. 심지어 다음과 같은 극악한 경우도 가능하겠죠.

if (...) {
 statement..
 statement..
}
else
 printf (...); // 이걸 그냥 없애거나 주석처리해 버리면? NO!!
a = b;
...

약간의 불필요한 로드를 감수하더라도 그냥 #include <stdio.h> 바로 다음에서 printf()를 새로 정의하는 게 안전할 것 같습니다.

익명 사용자의 이미지

약간의 불필요한 로드를 감수하더라도 그냥 #include <stdio.h> 바로 다음에서 printf()를 새로 정의하는 게 안전할 것 같습니다.

추후 printf 사용되지 않을거라는 가정하에만 사용할수 있고
실제로 코딩을 하다보면 종종 사용하게 됩니다.
재정의를 지웠다고 하더라도 필요없는 printf문이 다시 살아나게 됩니다.
다시 사용되지 않을 printf문들은 삭제하는 편이 좋습니다.

일반적인 open소스를 보더라도 printf문을 재정의해서 살려놓지는 않습니다.

bugiii의 이미지

매크로는 문제가 좀 있습니다. 예를 들어서

printf( "%d %d %d %d",
    a,
    b,
    c,
    d );

이렇게 코딩되어 있다면 단순히 printf 를 전처리기로 무시하기에는 어려운 상황이 될 것같습니다.

그리고, 매크로 함수에서의 가변인자는 gcc 정도에서만 지원되기 때문에 호환성에서도 문제가 생길 수 있습니다.

저라면 아래와 같이 해결할 것 같습니다.

--- ignore_printf.h

#define printf ignore_printf
extern int ignore_printf( char* format, ... );

--- ignore_printf.c
int ignore_printf( char* format, ... )
{
    return 0;
}

이것이 속도에 영향을 미치는 상황이라면 (지원되는 상황이라면) inline 으로 함수를 정의해도 괜찮을 것 같습니다.

p.s. 위에 똑같은 답변이 있었군요... 제대로 안보고 글을 썼습니다. 죄송합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.