[英]Syntax conflict with awk in C program
我試圖將一個小的awk腳本集成到C程序中,但是每次嘗試對其進行編譯時,都會遇到語法錯誤,因為gcc認為它不是C,而是C。
terminal_monitor = popen("awk '{if(l1){
download=($2-l1)/1024
download_round=sprintf("%.2f kB/s", download)
upload=($10-l2)/1024
upload_round=sprintf("%.2f kB/s", upload)
print download_round, upload_round
}
else{l1=$2; l2=$10;}}' <(grep eth0 /proc/net/dev) <(sleep 1; grep eth0 /proc/net/dev)", "r");
這是gcc( http://pastebin.com/fm8FAZjD )的輸出:
root@ubuntu:~/Desktop# gcc monitor.c -o monitor
monitor.c: In function ‘main’:
monitor.c:8:26: warning: missing terminating " character [enabled by default]
terminal_monitor = popen("awk '{if(l1){
^
monitor.c:8:1: error: missing terminating " character
terminal_monitor = popen("awk '{if(l1){
^
monitor.c:9:5: error: ‘download’ undeclared (first use in this function)
download=($2-l1)/1024
^
monitor.c:9:5: note: each undeclared identifier is reported only once for each function it appears in
monitor.c:9:15: error: ‘$2’ undeclared (first use in this function)
download=($2-l1)/1024
^
monitor.c:9:18: error: ‘l1’ undeclared (first use in this function)
download=($2-l1)/1024
^
monitor.c:10:5: error: expected ‘)’ before ‘download_round’
download_round=sprintf("%.2f kB/s", download)
^
monitor.c:14:1: error: too few arguments to function ‘popen’
}
^
In file included from monitor.c:1:0:
/usr/include/stdio.h:873:14: note: declared here
extern FILE *popen (const char *__command, const char *__modes) __wur;
^
monitor.c:14:1: error: expected ‘;’ before ‘}’ token
}
^
monitor.c: At top level:
monitor.c:15:1: error: expected identifier or ‘(’ before ‘else’
else{l1=$2; l2=$10;}}' <(grep eth0 /proc/net/dev) <(sleep 1; grep eth0 /proc/net/dev)", "r");
^
monitor.c:15:21: error: expected identifier or ‘(’ before ‘}’ token
else{l1=$2; l2=$10;}}' <(grep eth0 /proc/net/dev) <(sleep 1; grep eth0 /proc/net/dev)", "r");
^
monitor.c:15:22: warning: missing terminating ' character [enabled by default]
else{l1=$2; l2=$10;}}' <(grep eth0 /proc/net/dev) <(sleep 1; grep eth0 /proc/net/dev)", "r");
^
monitor.c:15:21: error: missing terminating ' character
else{l1=$2; l2=$10;}}' <(grep eth0 /proc/net/dev) <(sleep 1; grep eth0 /proc/net/dev)", "r");
^
monitor.c:16:1: error: expected identifier or ‘(’ before ‘if’
if (terminal_monitor == NULL) {
^
monitor.c:20:1: error: expected identifier or ‘(’ before ‘while’
while (terminal_monitor!= NULL){
^
monitor.c:25:1: error: expected identifier or ‘(’ before ‘return’
return 0;
^
monitor.c:26:1: error: expected identifier or ‘(’ before ‘}’ token
}
^
有什么辦法告訴gcc這不是C,並且應該像普通字符串一樣處理?
“整合”甚至是什么意思? 如果只希望C程序包含AWK源,則它必須是正確的C字符串。
您可以通過使用反斜杠將雙引號轉義來嵌入雙引號,“ here is a quoted string: \\"hello\\""
。
對於較長的文本,使用C的相鄰字符串文字的自動串聯很方便,它使您不必使用行繼續:
const char *awkcode =
"awk '{if(l1){"
"download=($2-l1)/1024"
"download_round=sprintf(\"%.2f kB/s\", download)"
"upload=($10-l2)/1024"
"upload_round=sprintf(\"%.2f kB/s\", upload)"
"print download_round, upload_round"
"}"
"else{l1=$2; l2=$10;}}' <(grep eth0 /proc/net/dev)"
" <(sleep 1; grep eth0";
" /proc/net/dev)\", \"r\");"
這很難理解,但是可以改進。
嘗試在所有行尾添加反斜杠“ \\”。 由於程序中的每一行都被視為C的單獨指令,因此它給出了您提到的那些錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.