Your C is not standard C
🇬🇧 English
This is an incomplete list of incompatibilities between C as written in the standard and C as it exists in practice for people who use gcc or clang with glibc or musl.
By default, gcc and clang recognize the asm keyword as an extension. In standard C, asm is a valid non-reserved identifier, so code that conforms to the standard may fail to compile with default settings. Compilers are not conformant by default, and the standard could make asm a reserved word as C++ does, though it has not.
The standard requires FLT_ROUNDS to reflect runtime changes to the rounding mode made through fesetround in <fenv.h>. However, gcc always defines FLT_ROUNDS as 1 (round to nearest), regardless of the runtime rounding mode. Clang provides a builtin, __builtin_flt_rounds(), but gcc does not.
The C standard specifies floating-point pragmas, added in C99 and C23, to control arithmetic behavior. Over 27 years after C99, gcc still ignores all of them as no-ops, and clang supports only the C99 pragmas. Some functionality can be replicated with command-line flags, but those apply to the whole translation unit rather than to individual functions or blocks.
The standard requires qualifiers in function return types to be discarded. Clang, however, treats them as significant, so declaring int f(); and const int f(); together produces a conflicting-types error even though the two declarations should be identical.
🇸🇦 العربية
لغة C التي تستخدمها ليست C القياسية
هذه قائمة غير كاملة بأوجه عدم التوافق بين لغة C كما هي مكتوبة في المعيار، ولغة C كما هي موجودة فعليًا لدى من يستخدمون gcc أو clang مع glibc أو musl.
تتعرّف gcc وclang افتراضيًا على الكلمة المفتاحية asm كامتداد. في لغة C القياسية، تُعدّ asm معرّفًا صالحًا غير محجوز، لذلك قد يفشل تجميع الكود المتوافق مع المعيار بالإعدادات الافتراضية. المترجمات غير متوافقة تمامًا افتراضيًا، ويمكن للمعيار أن يجعل asm كلمة محجوزة كما في C++، لكنه لم يفعل ذلك.
يشترط المعيار أن يعكس FLT_ROUNDS تغييرات وضع التقريب التي تحدث أثناء التشغيل عبر fesetround في <fenv.h>. غير أن gcc تُعرّف FLT_ROUNDS دائمًا بالقيمة 1 (التقريب إلى الأقرب)، بصرف النظر عن وضع التقريب أثناء التشغيل. توفر clang دالة مدمجة هي __builtin_flt_rounds()، أما gcc فلا تملكها.
يحدد معيار C توجيهات الفاصلة العائمة، التي أُضيفت في C99 وC23، للتحكم في سلوك العمليات الحسابية. وبعد أكثر من 27 عامًا على C99، ما زالت gcc تتجاهلها جميعًا بوصفها عمليات فارغة، بينما تدعم clang توجيهات C99 فقط. يمكن محاكاة بعض هذه الوظائف بخيارات سطر الأوامر، لكنها تنطبق على وحدة الترجمة بأكملها لا على دوال أو كتل فردية.
يشترط المعيار إسقاط المؤهلات في أنواع إرجاع الدوال. أما clang فتعاملها كعناصر ذات دلالة، لذلك يؤدي التصريح عن int f(); وconst int f(); معًا إلى خطأ تعارض في الأنواع، رغم أن التصريحين يجب أن يكونا متطابقين.
لماذا تقبل gcc وclang لغة C غير القياسية افتراضيًا؟
يفعّل المترجمان بعض الامتدادات افتراضيًا، مثل التعامل مع asm ككلمة مفتاحية. ويمكن فرض الكود المتوافق تمامًا باستخدام خيارات -std، ولهذا يعتمد الالتزام بالمعيار على الإعدادات المستخدمة.
🇧🇩 বাংলা
আপনার C স্ট্যান্ডার্ড C নয়
স্ট্যান্ডার্ডে বর্ণিত C এবং glibc বা musl সহ gcc বা clang ব্যবহারকারীদের বাস্তবে ব্যবহৃত C-এর মধ্যে অসঙ্গতির একটি অসম্পূর্ণ তালিকা এখানে দেওয়া হলো।
ডিফল্টভাবে, gcc ও clang asm কীওয়ার্ডকে একটি এক্সটেনশন হিসেবে চিনে। স্ট্যান্ডার্ড C-তে asm একটি বৈধ, সংরক্ষিত নয় এমন শনাক্তকারী, তাই স্ট্যান্ডার্ড-অনুযায়ী কোড ডিফল্ট সেটিংসে কম্পাইল নাও হতে পারে। কম্পাইলারগুলো ডিফল্টভাবে কনফর্ম নয়, এবং স্ট্যান্ডার্ড C++-এর মতো asm-কে সংরক্ষিত শব্দ বানাতে পারত, যদিও তা করা হয়নি।
স্ট্যান্ডার্ড অনুযায়ী FLT_ROUNDS, <fenv.h>-এর fesetround-এর মাধ্যমে রানটাইমে রাউন্ডিং মোডের পরিবর্তনকে প্রতিফলিত করবে। তবে gcc রানটাইম রাউন্ডিং মোড যা-ই হোক না কেন, FLT_ROUNDS-কে সবসময় 1 (নিকটতমে রাউন্ড) হিসেবে সংজ্ঞায়িত করে। Clang __builtin_flt_rounds() নামে একটি বিল্টইন দেয়, কিন্তু gcc তা দেয় না।
C স্ট্যান্ডার্ড গাণিতিক আচরণ নিয়ন্ত্রণের জন্য ফ্লোটিং-পয়েন্ট প্র্যাগমা নির্দিষ্ট করে, যা C99 ও C23-এ যুক্ত হয়েছে। C99-এর ২৭ বছরেরও বেশি পরে, gcc এখনও এগুলোকে কোনো কাজ না করা (no-op) হিসেবে উপেক্ষা করে, এবং clang শুধু C99-এর প্র্যাগমা সমর্থন করে। কিছু কার্যকারিতা কমান্ড-লাইন ফ্ল্যাগ দিয়ে অনুকরণ করা যায়, কিন্তু সেগুলো পৃথক ফাংশন বা ব্লকের বদলে পুরো ট্রান্সলেশন ইউনিটে প্রযোজ্য হয়।
স্ট্যান্ডার্ড অনুযায়ী ফাংশনের রিটার্ন টাইপের কোয়ালিফায়ার বাদ দিতে হয়। তবে clang এগুলোকে গুরুত্বপূর্ণ হিসেবে বিবেচনা করে, তাই int f(); ও const int f(); একসঙ্গে ঘোষণা করলে টাইপ-সংঘর্ষের ত্রুটি দেখা দেয়, যদিও দুটি ঘোষণা একই হওয়ার কথা।
gcc ও clang ডিফল্টভাবে অ-স্ট্যান্ডার্ড C কেন গ্রহণ করে?
দুটি কম্পাইলারই ডিফল্টভাবে কিছু এক্সটেনশন সক্রিয় রাখে, যেমন asm-কে কীওয়ার্ড হিসেবে গণ্য করা। -std ফ্ল্যাগ দিয়ে কঠোরভাবে কনফর্ম কোড বাধ্যতামূলক করা যায়, তাই কমপ্লায়েন্স ব্যবহৃত সেটিংসের উপর নির্ভর করে।
🇩🇪 Deutsch
Ihr C ist nicht der Standard-C
Dies ist eine unvollständige Liste von Inkompatibilitäten zwischen dem C, wie es im Standard beschrieben ist, und dem C, wie es in der Praxis für Nutzer von gcc oder clang mit glibc oder musl existiert.
Standardmäßig erkennen gcc und clang das Schlüsselwort asm als Erweiterung. In Standard-C ist asm ein gültiger, nicht reservierter Bezeichner. Daher kann standardkonformer Code mit den Standardeinstellungen möglicherweise nicht kompiliert werden. Compiler sind standardmäßig nicht konform, und der Standard hätte asm wie in C++ zu einem reservierten Wort machen können, hat dies jedoch nicht getan.
Der Standard verlangt, dass FLT_ROUNDS Laufzeitänderungen des Rundungsmodus widerspiegelt, die über fesetround in <fenv.h> vorgenommen werden. gcc definiert FLT_ROUNDS jedoch immer als 1 (zum Nächstgelegenen runden), unabhängig vom Rundungsmodus zur Laufzeit. Clang stellt eine eingebaute Funktion __builtin_flt_rounds() bereit, gcc hingegen nicht.
Der C-Standard legt Gleitkomma-Pragmas fest, die in C99 und C23 hinzugefügt wurden, um das arithmetische Verhalten zu steuern. Mehr als 27 Jahre nach C99 ignoriert gcc sie immer noch alle als No-Ops, und clang unterstützt nur die Pragmas aus C99. Ein Teil der Funktionalität lässt sich mit Kommandozeilen-Flags nachbilden, diese gelten jedoch für die gesamte Übersetzungseinheit und nicht für einzelne Funktionen oder Blöcke.
Der Standard verlangt, dass Qualifizierer in Rückgabetypen von Funktionen verworfen werden. Clang behandelt sie dagegen als bedeutsam. Daher führt die Deklaration von int f(); und const int f(); zusammen zu einem Fehler wegen widersprüchlicher Typen, obwohl beide Deklarationen identisch sein sollten.
Warum akzeptieren gcc und clang standardmäßig nicht standardkonformes C?
Beide Compiler aktivieren standardmäßig bestimmte Erweiterungen, zum Beispiel die Behandlung von asm als Schlüsselwort. Streng konformer Code lässt sich mit den Flags -std erzwingen, daher hängt die Konformität von den verwendeten Einstellungen ab.
🇪🇸 Español
Tu C no es C estándar
Esta es una lista incompleta de incompatibilidades entre el C descrito en el estándar y el C que existe en la práctica para quienes usan gcc o clang con glibc o musl.
De forma predeterminada, gcc y clang reconocen la palabra clave asm como una extensión. En C estándar, asm es un identificador válido no reservado, por lo que el código conforme con el estándar puede no compilarse con la configuración predeterminada. Los compiladores no son conformes por defecto, y el estándar podría convertir asm en una palabra reservada como hace C++, aunque no lo ha hecho.
El estándar exige que FLT_ROUNDS refleje los cambios en tiempo de ejecución del modo de redondeo realizados mediante fesetround en <fenv.h>. Sin embargo, gcc siempre define FLT_ROUNDS como 1 (redondeo al más cercano), independientemente del modo de redondeo en tiempo de ejecución. Clang ofrece una función integrada, __builtin_flt_rounds(), pero gcc no.
El estándar C especifica pragmas de punto flotante, añadidos en C99 y C23, para controlar el comportamiento aritmético. Más de 27 años después de C99, gcc sigue ignorando todos ellos como operaciones nulas, y clang solo admite los pragmas de C99. Parte de esta funcionalidad puede replicarse con opciones de línea de comandos, pero estas se aplican a toda la unidad de traducción y no a funciones o bloques individuales.
El estándar exige que los calificadores de los tipos de retorno de función se descarten. Clang, sin embargo, los considera significativos, de modo que declarar int f(); y const int f(); juntos produce un error de tipos conflictivos, aunque ambas declaraciones deberían ser idénticas.
¿Por qué gcc y clang aceptan C no estándar por defecto?
Ambos compiladores activan por defecto ciertas extensiones, como tratar asm como palabra clave. El código estrictamente conforme puede exigirse con las opciones -std, por lo que el cumplimiento depende de la configuración utilizada.
🇫🇷 Français
Votre C n'est pas le C standard
Voici une liste incomplète des incompatibilités entre le C tel qu'il est décrit dans la norme et le C tel qu'il existe en pratique pour les utilisateurs de gcc ou clang avec glibc ou musl.
Par défaut, gcc et clang reconnaissent le mot-clé asm comme une extension. En C standard, asm est un identifiant valide non réservé ; un code conforme à la norme peut donc ne pas compiler avec les paramètres par défaut. Les compilateurs ne sont pas conformes par défaut, et la norme pourrait faire d'asm un mot réservé comme en C++, ce qu'elle n'a pas fait.
La norme exige que FLT_ROUNDS reflète les modifications du mode d'arrondi effectuées à l'exécution via fesetround dans <fenv.h>. Pourtant, gcc définit toujours FLT_ROUNDS à 1 (arrondi au plus proche), quel que soit le mode d'arrondi en cours d'exécution. Clang fournit un élément intégré, __builtin_flt_rounds(), mais gcc n'en dispose pas.
La norme C spécifie des pragmas à virgule flottante, ajoutés en C99 et C23, pour contrôler le comportement arithmétique. Plus de 27 ans après C99, gcc les ignore toujours comme des opérations sans effet, et clang ne prend en charge que les pragmas de C99. Certaines fonctionnalités peuvent être reproduites avec des options de ligne de commande, mais celles-ci s'appliquent à l'ensemble de l'unité de traduction et non à des fonctions ou blocs individuels.
La norme exige que les qualificatifs des types de retour de fonction soient ignorés. Clang, en revanche, les considère comme significatifs ; déclarer int f(); et const int f(); ensemble produit donc une erreur de types conflictuels, alors que ces deux déclarations devraient être identiques.
Pourquoi gcc et clang acceptent-ils par défaut du C non standard ?
Les deux compilateurs activent par défaut certaines extensions, comme le traitement d'asm comme mot-clé. Un code strictement conforme peut être imposé avec les options -std, c'est pourquoi la conformité dépend des paramètres utilisés.
🇮🇳 हिन्दी
आपका C मानक C नहीं है
यह उन असंगतियों की अपूर्ण सूची है जो मानक में वर्णित C और glibc या musl के साथ gcc या clang का उपयोग करने वालों के लिए व्यवहार में मौजूद C के बीच हैं।
डिफ़ॉल्ट रूप से, gcc और clang asm कीवर्ड को एक एक्सटेंशन के रूप में पहचानते हैं। मानक C में, asm एक मान्य गैर-आरक्षित पहचानकर्ता है, इसलिए मानक-अनुरूप कोड डिफ़ॉल्ट सेटिंग्स के साथ संकलित नहीं हो सकता। कंपाइलर डिफ़ॉल्ट रूप से अनुरूप नहीं होते, और मानक asm को C++ की तरह आरक्षित शब्द बना सकता था, हालांकि उसने ऐसा नहीं किया है।
मानक के अनुसार FLT_ROUNDS को <fenv.h> में fesetround के माध्यम से किए गए रनटाइम राउंडिंग मोड परिवर्तनों को दर्शाना चाहिए। हालांकि, gcc रनटाइम राउंडिंग मोड की परवाह किए बिना FLT_ROUNDS को हमेशा 1 (निकटतम तक राउंड) के रूप में परिभाषित करता है। Clang __builtin_flt_rounds() नामक एक बिल्टिन प्रदान करता है, लेकिन gcc ऐसा नहीं करता।
C मानक अंकगणितीय व्यवहार को नियंत्रित करने के लिए फ़्लोटिंग-पॉइंट pragma निर्दिष्ट करता है, जो C99 और C23 में जोड़े गए थे। C99 के 27 वर्ष से अधिक बाद भी, gcc इन सभी को no-op मानकर अनदेखा करता है, और clang केवल C99 के pragma का समर्थन करता है। कुछ कार्यक्षमता कमांड-लाइन फ़्लैग से दोहराई जा सकती है, लेकिन ये व्यक्तिगत फ़ंक्शन या ब्लॉक के बजाय पूरी ट्रांसलेशन यूनिट पर लागू होते हैं।
मानक के अनुसार फ़ंक्शन रिटर्न टाइप के क्वालिफ़ायर हटा दिए जाने चाहिए। Clang, हालांकि, उन्हें महत्वपूर्ण मानता है, इसलिए int f(); और const int f(); दोनों घोषित करने पर टाइप-संघर्ष त्रुटि आती है, जबकि ये दोनों घोषणाएं समान होनी चाहिए।
gcc और clang डिफ़ॉल्ट रूप से गैर-मानक C क्यों स्वीकार करते हैं?
दोनों कंपाइलर डिफ़ॉल्ट रूप से कुछ एक्सटेंशन सक्षम करते हैं, जैसे asm को कीवर्ड मानना। -std फ़्लैग से कड़ाई से अनुरूप कोड लागू किया जा सकता है, इसलिए अनुपालन उपयोग की गई सेटिंग्स पर निर्भर करता है।
🇮🇩 Bahasa Indonesia
C Anda Bukan C Standar
Ini adalah daftar tidak lengkap mengenai ketidaksesuaian antara C seperti yang tertulis dalam standar dan C seperti yang ada dalam praktik bagi pengguna gcc atau clang dengan glibc atau musl.
Secara default, gcc dan clang mengenali kata kunci asm sebagai ekstensi. Dalam C standar, asm adalah pengenal yang valid dan tidak dicadangkan, sehingga kode yang sesuai dengan standar mungkin gagal dikompilasi dengan pengaturan default. Kompilator tidak sepenuhnya sesuai secara default, dan standar dapat menjadikan asm sebagai kata cadangan seperti di C++, namun hal itu belum dilakukan.
Standar mewajibkan FLT_ROUNDS mencerminkan perubahan mode pembulatan saat runtime yang dilakukan melalui fesetround di <fenv.h>. Namun, gcc selalu mendefinisikan FLT_ROUNDS sebagai 1 (membulatkan ke yang terdekat), terlepas dari mode pembulatan saat runtime. Clang menyediakan builtin, __builtin_flt_rounds(), tetapi gcc tidak.
Standar C menetapkan pragma floating-point, yang ditambahkan di C99 dan C23, untuk mengendalikan perilaku aritmetika. Lebih dari 27 tahun sejak C99, gcc masih mengabaikan semuanya sebagai no-op, dan clang hanya mendukung pragma C99. Sebagian fungsionalitas dapat direplikasi dengan flag baris perintah, tetapi flag tersebut berlaku untuk seluruh translation unit, bukan untuk fungsi atau blok tertentu.
Standar mewajibkan kualifier pada tipe kembalian fungsi dibuang. Clang, sebaliknya, menganggapnya bermakna, sehingga mendeklarasikan int f(); dan const int f(); bersama-sama menghasilkan galat tipe yang bertentangan, padahal kedua deklarasi tersebut seharusnya identik.
Mengapa gcc dan clang menerima C yang tidak standar secara default?
Kedua kompilator mengaktifkan ekstensi tertentu secara default, seperti memperlakukan asm sebagai kata kunci. Kode yang sepenuhnya sesuai standar dapat dipaksakan dengan flag -std, itulah sebabnya kepatuhan bergantung pada pengaturan yang digunakan.
🇯🇵 日本語
あなたの C は標準 C ではない
これは、標準規格に書かれている C と、glibc や musl を使って gcc や clang を利用している人々の現実の C との間の非互換性の、不完全なリストです。
gcc と clang はデフォルトで asm キーワードを拡張機能として認識します。標準 C では asm は予約されていない有効な識別子であるため、標準に準拠したコードでもデフォルト設定ではコンパイルできない場合があります。コンパイラはデフォルトでは準拠しておらず、標準は C++ のように asm を予約語にすることもできましたが、そうはなっていません。
標準では、<fenv.h> の fesetround によって行われた実行時の丸めモードの変更を FLT_ROUNDS が反映することが要求されています。しかし gcc は、実行時の丸めモードに関係なく FLT_ROUNDS を常に 1(最近接値への丸め)として定義します。clang は __builtin_flt_rounds() という組み込み関数を提供していますが、gcc にはありません。
C 標準は、算術動作を制御するための浮動小数点プラグマを規定しています。これらは C99 と C23 で追加されました。C99 から 27 年以上経った今でも、gcc はこれらすべてを何もしない命令として無視しており、clang は C99 のプラグマのみをサポートしています。一部の機能はコマンドラインフラグで再現できますが、それらは個々の関数やブロックではなく、翻訳単位全体に適用されます。
標準では、関数の戻り値型の修飾子は破棄されることが要求されています。しかし clang はこれらを意味のあるものとして扱うため、int f(); と const int f(); を両方宣言すると、本来は同一であるべき二つの宣言であるにもかかわらず、型の衝突エラーが発生します。
gcc と clang がデフォルトで非標準の C を受け入れるのはなぜですか?
両方のコンパイラは、asm をキーワードとして扱うなど、特定の拡張機能をデフォルトで有効にしています。厳密に準拠したコードは -std フラグで強制できるため、準拠性は使用される設定に依存します。
🇧🇷 Português
Seu C não é o C padrão
Esta é uma lista incompleta de incompatibilidades entre o C conforme escrito no padrão e o C que existe na prática para quem usa gcc ou clang com glibc ou musl.
Por padrão, gcc e clang reconhecem a palavra-chave asm como uma extensão. No C padrão, asm é um identificador válido não reservado, portanto um código em conformidade com o padrão pode não compilar com as configurações padrão. Os compiladores não são conformes por padrão, e o padrão poderia tornar asm uma palavra reservada, como faz o C++, mas não o fez.
O padrão exige que FLT_ROUNDS reflita as mudanças em tempo de execução do modo de arredondamento feitas por meio de fesetround em <fenv.h>. No entanto, o gcc sempre define FLT_ROUNDS como 1 (arredondar para o mais próximo), independentemente do modo de arredondamento em tempo de execução. O clang oferece uma função embutida, __builtin_flt_rounds(), mas o gcc não.
O padrão C especifica pragmas de ponto flutuante, adicionados no C99 e no C23, para controlar o comportamento aritmético. Mais de 27 anos depois do C99, o gcc ainda os ignora todos como operações nulas, e o clang suporta apenas os pragmas do C99. Parte da funcionalidade pode ser replicada com opções de linha de comando, mas elas se aplicam a toda a unidade de tradução, e não a funções ou blocos individuais.
O padrão exige que os qualificadores em tipos de retorno de função sejam descartados. O clang, porém, os trata como significativos, de modo que declarar int f(); e const int f(); juntos gera um erro de tipos conflitantes, embora as duas declarações devessem ser idênticas.
Por que gcc e clang aceitam C não padrão por padrão?
Ambos os compiladores ativam certas extensões por padrão, como tratar asm como palavra-chave. Código estritamente conforme pode ser exigido com as opções -std, por isso a conformidade depende das configurações utilizadas.
🇷🇺 Русский
Ваш C — не стандартный C
Это неполный список несовместимостей между C, описанным в стандарте, и C, который существует на практике у тех, кто использует gcc или clang с glibc или musl.
По умолчанию gcc и clang распознают ключевое слово asm как расширение. В стандартном C asm является допустимым нерезервированным идентификатором, поэтому код, соответствующий стандарту, может не компилироваться с настройками по умолчанию. Компиляторы по умолчанию не соответствуют стандарту, и стандарт мог бы сделать asm зарезервированным словом, как это сделано в C++, но не сделал.
Стандарт требует, чтобы FLT_ROUNDS отражал изменения режима округления во время выполнения, выполненные через fesetround из <fenv.h>. Однако gcc всегда определяет FLT_ROUNDS как 1 (округление к ближайшему), независимо от режима округления во время выполнения. Clang предоставляет встроенную функцию __builtin_flt_rounds(), а gcc — нет.
Стандарт C задаёт директивы плавающей точки, добавленные в C99 и C23, для управления арифметическим поведением. Спустя более 27 лет после C99 gcc по-прежнему игнорирует их все как пустые операции, а clang поддерживает только директивы C99. Часть функциональности можно воспроизвести флагами командной строки, но они применяются ко всей единице трансляции, а не к отдельным функциям или блокам.
Стандарт требует отбрасывать квалификаторы в возвращаемых типах функций. Clang же считает их значимыми, поэтому объявление int f(); вместе с const int f(); приводит к ошибке конфликтующих типов, хотя эти два объявления должны быть идентичны.
Почему gcc и clang по умолчанию принимают нестандартный C?
Оба компилятора по умолчанию включают некоторые расширения, например, считают asm ключевым словом. Строго соответствующий стандарту код можно обеспечить флагами -std, поэтому соответствие зависит от используемых настроек.
🇨🇳 简体中文
你的 C 不是标准 C
这是一份不完整的清单,列出了标准中规定的 C 与实际中使用 glibc 或 musl 的 gcc 或 clang 用户所面对的 C 之间的不兼容之处。
默认情况下,gcc 和 clang 会将 asm 关键字识别为扩展。在标准 C 中,asm 是一个有效的非保留标识符,因此符合标准的代码在默认设置下可能无法编译。编译器默认并不符合标准,标准本可以像 C++ 那样将 asm 设为保留字,但它并未这样做。
标准要求 FLT_ROUNDS 反映通过 <fenv.h> 中的 fesetround 在运行时对舍入模式所做的更改。然而,无论运行时的舍入模式如何,gcc 始终将 FLT_ROUNDS 定义为 1(向最近舍入)。Clang 提供了内置函数 __builtin_flt_rounds(),但 gcc 没有。
C 标准规定了浮点 pragma(于 C99 和 C23 中加入),用于控制算术行为。在 C99 发布 27 年多之后,gcc 仍将所有这些 pragma 当作空操作忽略,而 clang 仅支持 C99 的 pragma。部分功能可以通过命令行选项实现,但这些选项作用于整个翻译单元,而不是单个函数或代码块。
标准要求函数返回类型中的限定符被丢弃。然而,clang 将其视为有意义的内容,因此同时声明 int f(); 和 const int f(); 会产生类型冲突错误,尽管这两个声明本应完全相同。
为什么 gcc 和 clang 默认接受非标准的 C?
两个编译器默认都会启用某些扩展,例如将 asm 视为关键字。可以通过 -std 选项强制执行严格符合标准的代码,因此合规性取决于所使用的设置。