LINUX.ORG.RU

[gcc] неявная декларация popen/pclose

 


0

1

В С-коде вызываю popen/pclose. gcc запускается с опциями -std=c99 -pedantic -Wall и ругается на неявную декларацию popen и pclose. Но stdio.h подключен! Что я не так делаю?

Это, конечно, лишь варнинг, но хочется совсем без них.


Ответ на: комментарий от ono
[~/src/dwm] $ make -B
gcc -std=c99 -pedantic -Wall -Ofast -DVERSION=\"5.9.18\" -o dwm dwm.c -s -lX11
dwm.c: В функции «nametag»:
dwm.c:1657:2: предупреждение: неявная декларация функции «popen» [-Wimplicit-function-declaration]
dwm.c:1662:2: предупреждение: неявная декларация функции «pclose» [-Wimplicit-function-declaration]

[~/src/dwm] $ grep '#include' dwm.c
#include <errno.h>
#include <locale.h>
#include <stdarg.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <X11/cursorfont.h>
#include <X11/keysym.h>
#include <X11/Xatom.h>
#include <X11/Xlib.h>
#include <X11/Xproto.h>
#include <X11/Xutil.h>
#include "config.h"
toady2
() автор топика

а маны за тебя Пушкин читать будет?

Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

popen(), pclose():
    _POSIX_C_SOURCE >= 2 || _XOPEN_SOURCE || _BSD_SOURCE || _SVID_SOURCE
arsi ★★★★★
()
Ответ на: комментарий от arsi

Извиняюсь, не программист — просто хочу dwm под себя подправить.

Судя по флагам в Makefile, исходник следует стандарту C99. То есть мне надо поставть ещё

#define _XOPEN_SOURCE 600
или 700?..

toady2
() автор топика
Ответ на: комментарий от toady2

> Судя по флагам в Makefile, исходник следует стандарту C99.

C99 — это стандарт языка и базовых библиотек, и popen/pclose в них не входят.

> То есть мне надо поставть ещё
> #define _XOPEN_SOURCE 600
> или 700?..

в данном конкретном случае — пофиг. как видно из мана, тебе необходимо определить либо _POSIX_C_SOURCE значением 2 или больше, либо определить любым целочисленным значением или без значений вовсе _XOPEN_SOURCE, _BSD_SOURCE или _SVID_SOURCE.

почитай на досуге man feature_test_macros.

arsi ★★★★★
()
Ответ на: комментарий от arsi

и popen/pclose в них не входят.

Их чем-то заменили или просто выбросили? Ведь довольно полезные функции, по-моему.

toady2
() автор топика
Ответ на: комментарий от arsi

И тем не менее именно опция std=c99 приводит к этим ворнингам

[del@del-arch ~]$ gcc -std=c99 -pedantic -Wall test_popen.c -o test_popen
test_popen.c: In function ‘main’:
test_popen.c:5:2: warning: implicit declaration of function ‘popen’ [-Wimplicit-function-declaration]
test_popen.c:6:2: warning: implicit declaration of function ‘pclose’ [-Wimplicit-function-declaration]


[del@del-arch ~]$ gcc -std=c99  -Wall test_popen.c -o test_popen
test_popen.c: In function ‘main’:
test_popen.c:5:2: warning: implicit declaration of function ‘popen’ [-Wimplicit-function-declaration]
test_popen.c:6:2: warning: implicit declaration of function ‘pclose’ [-Wimplicit-function-declaration]


[del@del-arch ~]$ gcc  -Wall test_popen.c -o test_popen
[del@del-arch ~]$ 

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от DELIRIUM

Собственно код:

#include <stdio.h>

int main()
{
	popen(NULL, NULL);
	pclose(NULL);
	return 0;
}

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от arsi

Ясно.

Спасибо всем, проблема решилась добавлением -D_XOPEN_SOURCE=600.

toady2
() автор топика
Ответ на: комментарий от DELIRIUM

> И тем не менее именно опция std=c99 приводит к этим ворнингам

именно эта опция приводит к предопределению компилятором макроса __STRICT_ANSI__, который «мешает» автоматическому определению необходимых ТСу макросов в features.h, а в результате и интерфейсов необходимых функций в stdio.h, что и приводит к ворнингам. (так будет при компиляции с любым -std=*, кроме -std=gnu*, которые и устанавливаются по дефолту.)

arsi ★★★★★
()
$ cat test.c 
#include <stdlib.h>
#include <stdio.h>

int
main(int argc, char *argv[])
{
  FILE *ls;

  ls = popen ("ls -l", "r");
  pclose (ls);

  exit(EXIT_SUCCESS);
}
$ gcc -Wall -std=c99 test.c
test.c: In function ‘main’:
test.c:9:3: warning: implicit declaration of function ‘popen’ [-Wimplicit-function-declaration]
test.c:9:6: warning: assignment makes pointer from integer without a cast [enabled by default]
test.c:10:3: warning: implicit declaration of function ‘pclose’ [-Wimplicit-function-declaration]
$ gcc -Wall -std=gnu99 test.c
$ gcc -Wall -std=c89 test.c
test.c: In function ‘main’:
test.c:9:3: warning: implicit declaration of function ‘popen’ [-Wimplicit-function-declaration]
test.c:9:6: warning: assignment makes pointer from integer without a cast [enabled by default]
test.c:10:3: warning: implicit declaration of function ‘pclose’ [-Wimplicit-function-declaration]
$ gcc -Wall -std=gnu89 test.c
$ gcc -Wall -std=c89 -D_XOPEN_SOURCE test.c
$ 

По умолчанию используется -std=gnu89. При -std=c89 и -std=c99 определяется макрос __STRICT_ANSI__, который в итоге отключает определение popen и pclose в коде без указания требуемых макросов.

kim-roader ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.