Из параграфа 7.1.3 параграфа 2 n1570 (который является проектом C1x):
Другие идентификаторы не зарезервированы.
Эта часть означает, что getline
не должен определяться <stdio.h>
, так как это не зарезервированный идентификатор в соответствии со спецификацией. Поэтому, если ваша библиотека определяет getline
в <stdio.h>
, это технически не соответствует стандарту C ...
Однако, вы должны иметь возможность использовать макросы функциональных тестов, чтобы getline
был неопределенным в <stdio.h>
.
#undef _POSIX_C_SOURCE
#define _POSIX_C_SOURCE 200112L
#include <stdio.h>
Это даст вам только определения из более старых стандартов POSIX. Это не будет работать в некоторых реализациях GNU C ++, для некоторых людей EXTrEmeLY fruSTRaTiNG .
Соответствующий раздел справочной страницы (взят из справочной страницы glibc, извините ...)
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
getline(), getdelim():
Since glibc 2.10:
_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700
Before glibc 2.10:
_GNU_SOURCE
Эта часть man-страницы сообщает вам, какие макросы нужно определить, для каких значений получить определение. Держу пари, что _POSIX_C_SOURCE
уже определено вашим компилятором для 200809L
.
Идея макросов функционального тестирования заключается в том, что если вы определяете свои макросы, такие как _POSIX_C_SOURCE
, _BSD_SOURCE
, _XOPEN_SOURCE
и т. Д., Для значений, которые вы хотите, вам не нужно беспокоиться о конфликте новых библиотечных функций. с вашими существующими функциями. Существует также _GNU_SOURCE
, который включает все , если вы используете glibc, но я предлагаю дать этому макросу широкое место.